zoukankan      html  css  js  c++  java
  • reflect 反射结合集合泛型的总结

    集合泛型: 

    可以放任何对象的 ArrayList  ArrayList list = new ArrayList();  没有限定泛型类型.

    list.add("lilin");list.add(100);System.out.println(list);//很容得知结果能够是["lilin",100];

    ArrayList<String> list1 = new ArrayList<String>(); 限定了只能存放String类型的数据

    list1.add("lilin");
    // String 泛型的集合 是不能添加int的类型的数据的
    // list1.add(100);//此时编译是不会通过的,泛型检查了输入的正确性:

    泛型的检查,只会在编译的时候检查,如果我们能够绕过编译的动作,就能避开输入的正确的检查操作,导致String泛型的集合中会存在不是String类型的数据.

    反射reflect的操作,无论是CLass Method Filed 等,都是运行时加载的,不需要通过编译操作.

    //下面通过反射操作,实现把int 100  放入  String泛型的list中去:

    ArrayList<String> list = new ArrayList<String>();
    Class c = list.getClass();
     try {
           //通过反射,获取到list的add方法,简单处理异常信息 Method m
    = c2.getMethod("add", Object.class);
           //通过方法的反射,就能把int类型的数据,添加到string泛型的list中去      m.invoke(list1,
    100);
            //结果很明显,100 能够成功的添加进去 System.out.println(list1);
            //此时要特别注意的:不能在用String 类型来for循环当前的list; 在循环到int的100会跑出类型不匹配的异常信息
    for (String s : list1) { System.out.println(s); } } catch (Exception e) { e.printStackTrace(); }

    其实:本质的原因是,泛型主要是控制输入的正确验证的,而编译后的泛型集合类型,也就是  Class c1 = list.getClass();  Class c2 = list1.getClass();

    在编译后,集合的泛型是去泛型的,通过验证System.out.println(c1 == c2);   结果是true,也就是集合编译后,都是同一个类类型.

    所以:集合的泛型和反射的相关的方法结合使用时,要特别注意,反射的是运行时加载的,集合的编译检查输入的正确是会被绕过的.

  • 相关阅读:
    Chromium GN构建工具的使用
    cef 不更新编译
    Debugging SSL on Linux
    chromium url 请求流程
    mim
    qt打包发布问题 缺失qt动态库
    qmake生成pro的make总失败。但是qt creator里面是好的
    qt 与 x11 头文件同时引用
    Ubuntu16安装GTK+2.0教程
    gcc编译静态库到自己的程序 解决在不同linux下因libc版本问题而不能运行 版本兼容问题
  • 原文地址:https://www.cnblogs.com/lilin0719/p/5247317.html
Copyright © 2011-2022 走看看