- 前面说活可以通过Class对象可以获得成员变量的类型,不管该成员变量是不是私有的,但是如果成员变量是有泛型类型的参数的话,如Map<String, Integert>那么将无法获得其泛型参数的信息。
- 想要获得泛型参数的信息应该使用以下步骤:
- 将Type对象强制转换成ParameterizedType对象
- ParameterizedType类提供了getRawType()方法,可以返回没有泛型信息的原始类型
- 还有一个getActualTypeArguments()方法,这个方法可以返回泛型参数的数据类型
- 以下为代码,具体讲解穿插在代码中
package Chapter_6; import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.Map; public class GenericTest { private Map<String, Integer> score; public static void main(String args[]) throws Exception{ Class<GenericTest> clazz = GenericTest.class; Field field = clazz.getDeclaredField("score"); // 通过getDeclaredField可以获得成员变量,但是对于Map来说,仅仅可以知道它是个Map,无法知道键值对各自的数据类型 Class<?> a = field.getType(); // 获得field的数据类型,是Map System.out.println("score的类型是" + a); Type gType = field.getGenericType(); // 获得field的泛型类型 // 如果gType是ParameterizedType对象(参数化) if(gType instanceof ParameterizedType){ ParameterizedType pType = (ParameterizedType)gType; // 就把它转换成ParameterizedType对象 Type rType = pType.getRawType(); // 获得原始数据类型 Type[] tArgs = pType.getActualTypeArguments(); // 获得泛型类型的泛型参数(实际类型参数) System.out.println("泛型的类型是: "); for(int i=0; i<tArgs.length; i++){ System.out.println("第" + i + "个泛型类型是: " + tArgs[i]); } }else { System.out.println("出错!!!"); } } } //运行程序,看到以下输出: // score的类型是interface java.util.Map // 泛型的类型是: // 第0个泛型类型是: class java.lang.String // 第1个泛型类型是: class java.lang.Integer
java反射(10) 使用反射获取泛型信息
最新推荐文章于 2024-08-14 04:39:49 发布