private ArrayList<TencentEntity> objects1 = new ArrayList<>();
@Test
public void test4() throws Exception {
Field listField = this.getClass().getDeclaredField("objects1");
System.out.println(listField.getGenericType());
//获取 list 字段的泛型参数
ParameterizedType listGenericType = (ParameterizedType) listField.getGenericType();
Type[] listActualTypeArguments = listGenericType.getActualTypeArguments();
for (Type listActualTypeArgument : listActualTypeArguments) {
System.out.println(listActualTypeArgument);
}
}
运行结果:
java.util.ArrayList<com.example.test.test.genericity.one.TencentEntity>
class com.example.test.test.genericity.one.TencentEntity
通过反射获取该类的list字段,可以获取他的泛型。
但是如果 new 一个list,例:ArrayList objects2 = new ArrayList<>();
我使用了各种方法,都无法获得
@Test
public void test5() {
ArrayList<BookEntity> objects2 = new ArrayList<>();
objects2.add(new BookEntity("钢铁是怎样炼成的", 31.5));
Type genericSuperclass = objects2.getClass().getGenericSuperclass();
ParameterizedType parameterizedType = (ParameterizedType) genericSuperclass;
System.out.println(parameterizedType.getClass());
System.out.println(parameterizedType.getOwnerType());
System.out.println(parameterizedType.getRawType());
System.out.println(parameterizedType.getTypeName());
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
for (Type actualTypeArgument : actualTypeArguments) {
System.out.println(actualTypeArgument);
}
System.out.println(objects2);
}
返回结果:
class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
null
class java.util.AbstractList
java.util.AbstractList
E
[BookEntity(bookName=钢铁是怎样炼成的, money=31.5)]