最近,在网上看到一个问题,用反射可以在声明泛型为String的list中插入一个int数值;看到之后感到很有意思,就去查了下资料,然后聊作整理。

什么是List泛型擦除,为什么反射能够在ArrayList< String >中添加int类型呢??

首先:泛型的作用层在编译时,而在运行时泛型会被擦除。

其次:而反射在运行时获取到list的add方法,直接在运行时添加了数据,跳过了编译期。

在ArrayList 中的Integer数据类型只是为了数据安全,将数据规范后给编译器识别真正在运行的时候,仍然是Object.

package generic;
import java.lang.reflect.Method;
import java.util.ArrayList;
//泛型在编译时有效,运行时无效
public class TestGeneric01 {
	public static void main(String[] args) throws Exception{
		ArrayList<String> list=new ArrayList<>();
		list.add("A");
		list.add("B");
		list.add("Hello World");
		//list.add(200);
		//基于反射技术,将数值型200写入list集合中
		//获取类对象
		Class<?> cls = list.getClass(); //获取list的具体类型
		//获取类中的方法对象
		Method m = cls.getDeclaredMethod("add", Object.class); //获取类中的add方法,参数类型为Object类型
		//执行方法对象
		m.invoke(list, 200);
		m.invoke(list, true);
		System.out.println(list);
	}
}

运行结果

文章作者: 嘿手大叔
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 i·Space
Android
喜欢就支持一下吧
打赏
微信 微信
支付宝 支付宝