反射的两个特殊用法

反射非常强大,通过他可以很好的分析类,比如得到类在运行时的信息。还可以以别的方式得到对象。但还有特殊的用途,比如跳过编译检查。
现在看一下如何通过反射跳过编译器检查:

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) {


}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值