我希望您能在运行时访问已声明字段的通用类型。之前我认为由于Java类型擦除而不可能实现,但是某些知名框架通过反射在运行时利用了泛型类型,因此这一点并非不可能实现。
例如,Guice将基于您提供的泛型类型实现一个提供程序:
如何通过反射API访问字段或任何类型/方法等的“SomeType”泛型属性?
此外,还需了解如何通过Java 6注释处理器API访问这些通用类型属性。
谢谢。
编辑:
感谢大家提供的指引。我通过haylem的链接找到了一种方法,特别是Prenkov的文章Java Reflection: Generics。
以下是我正在寻找的答案:
例如,Guice将基于您提供的泛型类型实现一个提供程序:
public class Injectable{
@Inject
private Provider<SomeType> someTypeProvider;
}
如何通过反射API访问字段或任何类型/方法等的“SomeType”泛型属性?
此外,还需了解如何通过Java 6注释处理器API访问这些通用类型属性。
谢谢。
编辑:
感谢大家提供的指引。我通过haylem的链接找到了一种方法,特别是Prenkov的文章Java Reflection: Generics。
以下是我正在寻找的答案:
/**
* @author John Ericksen
*/
public class TypeReflectionExample {
public class SomeType{}
public class Injectable{
@Inject private Provider<SomeType> someTypeProvider;
}
public static void main(String[] args){
try {
Field providerField = Injectable.class.getDeclaredField("someTypeProvider");
Type genericFieldType = providerField.getGenericType();
if(genericFieldType instanceof ParameterizedType){
ParameterizedType aType = (ParameterizedType) genericFieldType;
Type[] fieldArgTypes = aType.getActualTypeArguments();
for(Type fieldArgType : fieldArgTypes){
Class fieldArgClass = (Class) fieldArgType;
System.out.println("fieldArgClass = " + fieldArgClass);
}
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
}
结果如下:
fieldArgClass = 类 test.TypeReflectionExample$SomeType
同样的方法也可以用于方法、构造函数、超类扩展/实现等。
我授予haylem奖励,因为他的帖子引导我找到了这个解决方案,即使它并没有直接回答我的问题。