在运行时指定generics集合类型参数(Javareflection)

我想在运行时使用reflection来获取集合的generics类型。

代码(JAVA):

Field collectionObject = object.getClass().getDeclaredField( collectionField.getName()); //here I compare to see if a collection if (Collection.class.isAssignableFrom(collectionObject.getType())) { // here I have to use the generic type of the collection // to see if it's from a specific type - in this case Persistable if (Persistable.class.isAssignableFrom(GENERIC_TYPE_COLLECTION.class)) { } } 

有没有办法在运行时在java中获取集合的generics类型? 在我的情况下,我需要集合的generics类型.class。

提前致谢!

类型擦除意味着在执行时不存在关于对象的generics类型的信息。

(链接到Angelika Langer的Java Generics FAQ的相关部分,该部分应该回答几乎所有关于Javagenerics的问题:)

但是,您对对象的类型并不感兴趣 – 您对字段的类型感兴趣。 我误解了这个问题,虽然答案已被接受,但我希望现在通过修复它来弥补:)

如果该字段本身不使用类型参数,则可以完成。 例如:

 import java.lang.reflect.*; import java.util.*; public class Test { public List names; public static void main(String [] args) throws Exception // Just for simplicity! { Field field = Test.class.getDeclaredField("names"); ParameterizedType type = (ParameterizedType) field.getGenericType(); // List System.out.println(type.getRawType()); // Just String in this case for (Type typeArgument : type.getActualTypeArguments()) { System.out.println(" " + typeArgument); } } } 

如果该字段位于类T且字段为List则您必须知道该实例的类型参数,以便知道该集合的类型参数。

将其转换为您需要的代码有点棘手 – 您确实需要知道集合类中的类型参数。 例如,如果有人声明:

 public class StringCollection implements Collection 

然后有一个StringCollection类型的字段,该字段本身不会有任何类型参数。 然后,您需要递归检查getGenericSuperTypegetGenericInterfaces直到找到所需内容。

尽管这是可能的,但这样做真的不容易。 如果我是你,我会尝试改变你的设计,这样你就不需要了。

你绝对可以做你想做的事。 类型擦除意味着您无法检查集合的实例是否为其generics类型,但您当然可以检查字段的generics类型。

 class Thing { List foo; } Field f = Thing.class.getDeclaredField("foo"); if( Collection.class.isAssignableFrom( f.getType() ) { Type t = f.getGenericType(); if( t instanceof ParameterizedType ) { Class genericType = (Class)((ParameterizedType)t).getActualTypeArguments()[0]; if( Persistable.class.isAssignableFrom( genericType ) ) return true; } } 

这里有很多可能出错的东西,例如,如果你有的话

 Class Thing { List foo; } 

那以上就不行了。

您可以使用Field.getGenericType从对象读取的字段的generics类型。 请注意,该字段可能是原始类型,是一种罕见的类型(通用但具有raw的generics参数),使用实例的类型,使用通配符等。

复制自我的post: https : //stackoverflow.com/questions/1004022/java-generic-class-determine-type/1005283#1005283

我已经使用了类似的解决方案来解释他在这里解释的一些项目并发现它非常有用。

http://blog.xebia.com/2009/02/07/acessing-generic-types-at-runtime-in-java/

它的jist使用以下命令在运行时确定类型参数:

 public Class returnedClass { ParameterizedType parameterizedType = (ParameterizedType) getClass().getGenericSuperClass(); return (Class) parameterizedtype.getActualTypeArguments()[0]; }