通过 Class 和 Method 来认识泛型的本质,在编译阶段验证是否有错误。
如果我们绕过编译就绕过泛型。
来看一个demo
最终我们得出结论,Class,Method,Field,反射操作 都是绕过编译的,都是在运行时刻来执行的 。
如果我们绕过编译就绕过泛型。
来看一个demo
- package practice.Reflect;
- import java.lang.reflect.Method;
- import java.util.ArrayList;
- /**
- * @Author: 言曌
- * @Date: 2017/11/17
- * @Time: 上午10:27
- */
- public class MethodDemo2 {
- public static void main(String args[]) {
- //什么类型都可以添加
- ArrayList list = new ArrayList();
- list.add("hello");
- list.add(2017);
- list.add(true);
- System.out.println(list);
- //只能添加String类型的元素
- ArrayList<String> list1 = new ArrayList<String>();
- list1.add("hello");
- //list1.add(2017);//错误
- Class c1 = list.getClass();
- Class c2 = list1.getClass();
- System.out.println(c1 == c2);//true
- //反射的操作都是编译之后的操作
- /**
- * c1==c2结果返回true说明编译之后集合的泛型是去泛型化的
- * Java中集合的泛型,是防止错误输入的,只在编译阶段有效
- * 绕过编译就无效了
- * 验证:我们可以通过方法的反射来操作,绕过编译
- */
- try {
- Method m = c1.getMethod("add",Object.class);
- m.invoke(list1,100);//绕过编译就绕过了泛型
- System.out.println(list1.size());
- System.out.println(list1);
- } catch (Exception e) {
- e.printStackTrace();
- }
- //最终我们确定,Class,Method,Field,反射操作 都是绕过编译的,都是在运行时刻来执行的
- }
- }
最终我们得出结论,Class,Method,Field,反射操作 都是绕过编译的,都是在运行时刻来执行的 。
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏