【发布时间】:2012-03-03 18:41:23
【问题描述】:
我希望在运行时访问已声明字段的泛型类型。我以前的印象是,由于 Java 类型擦除,这是不可能的。但是,情况并非如此,因为一些众所周知的框架会在运行时通过反射利用泛型类型。
例如,Guice 将根据您提供的泛型类型实现一个 Provider:
public class Injectable{
@Inject
private Provider<SomeType> someTypeProvider;
}
如何通过反射 API 访问字段的“SomeType”通用属性或任何此类类型/方法/等?
此外,了解如何通过 Java 6 Annotation Processor 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 = class test.TypeReflectionExample$SomeType
方法、构造函数、超类扩展/实现等也可以这样做
我要奖励 haylem,因为他的帖子让我找到了这个解决方案,即使它没有直接回答我的问题。
【问题讨论】:
-
我应该将此编辑移到我自己问题的答案中吗?试图找出将答案授予谁。
标签: java generics guice type-erasure annotation-processing