反射非常强大,通过他可以很好的分析类,比如得到类在运行时的信息。还可以以别的方式得到对象。但还有特殊的用途,比如跳过编译检查。
现在看一下如何通过反射跳过编译器检查:
ArrayList<Integer> list = new ArrayList<Integer>();
这个泛型集合的add方法只能添加整数,如果添加字符串编译器就会马上报错。如果不用list变量添加而是得到这个对象的Method对象添加元素就能跳过编译检查
// 得到带Object参数的add方法
Method addMethod=list.getClass().getMethod("add", Object.class);
addMethod.invoke(list, "abc");//通过Method对象调用list的add方法
System.out.println(list.get(0)); //输出abc
在看一下如何通过反射得到泛型参数的实际类型
由于无法通过泛型类型对象得到泛型参数类型,所以得定义一个方法。通过Method对象的参数类得到类型
Method applyMethod = GenericTest.class.getMethod("applyVector", ArrayList.class);
Type[] types = applyMethod.getGenericParameterTypes();
ParameterizedType pType = (ParameterizedType) types[0];
System.out.println(pType.getRawType()); // 输出:class java.util.ArrayList
System.out.println(pType.getActualTypeArguments()[0]); // 输出:class java.util.Date
public static void applyVector(ArrayList<Date> v1) {
}