2017-02-16 114 views
1

入门输入法的回报如果我有像这样一类:使用Java反射

class Test { 
    Thing<String> getThing(String thing) {} 
} 

我怎么能确定使用反射对测试的一个实例String.class? 我想要采取的路径是新的测试() - >获取类 - >查找方法 - >获取返回类型 - > - >以某种方式得到String.class,但我没有找到如何完成最后一部分。到目前为止,我得到了Thing<java.lang.String>,但不是内部类。

import org.reflections.ReflectionUtils; 

Iterables.getOnlyElement(ReflectionUtils.getAllMethods((new Test()).getClass())).getGenericType(); 

.getReturnType()只是让我Thing.class ...

+1

[类型擦除(https://docs.oracle.com/javase/tutorial/java/generics/erasure.html)。 –

+0

好吧,即时通讯看不到如何使用 – mathematician

+0

如果它不是一个泛型类型,它总是一个字符串 – mathematician

回答

1

在Java中,你可以使用标准的反射API(没有必要使用ReflectionUtils)得到它。您正确使用了getGenericReturnType。你只需要它转换为ParameterizedType

public static void main(String[] args) throws NoSuchMethodException { 
    Method m = Test.class.getDeclaredMethod("getThing", String.class); 
    Type type = m.getGenericReturnType(); 
    // type is Thing<java.lang.String> 
    if(type instanceof ParameterizedType) { 
     Type[] innerTypes = ((ParameterizedType) type).getActualTypeArguments(); 
     if(innerTypes.length == 1) { 
      Type innerType = innerTypes[0]; 
      if(innerType instanceof Class) { 
       // innerType is java.lang.String class 
       System.out.println(((Class<?>) innerType).getName()); 
      } 
     } 
    } 
} 
+0

完美!谢谢! – mathematician

+0

@mathematician,实际上它甚至更简单(即使在Java 1.5中也能运行),请检查更新后的答案。 –