Java 反射-通过反射来理解泛型的本质

  我们看一下下面的代码:

package com.example.Reflect;

import java.util.ArrayList;

public class MethodDemo2 {
    public static void main(String[] args) {
        ArrayList<Integer> list1 = new ArrayList<Integer>();
        ArrayList<String> list2 = new ArrayList<String>();
        Class c1 = list1.getClass();
        Class c2 = list2.getClass();
        System.out.println(c1 == c2);
    }
}

  上面的代码是一个简单集合的使用,其中list1的泛型是Integer,表示只能向里面加Integer的对象,list2的泛型是String,表示只能向里面加String的对象。而我们会发现c1 == c2却为true,表示说反射的操作都是编译之后的操作,编译之后集合的泛型是去泛型化,也就是在运行的时候集合是没有泛型的。这时候我们可以得到一个结论:Java中集合的泛型,是防止错误输入的,只在编译阶段有效,绕过编译就无效了。
  我们可以通过方法的反射来操作,绕过编译

try {
            System.out.println(list1.size());
            Method method = c1.getMethod("add", Object.class);
            method.invoke(list1, "12234");
            System.out.println(list1.size());
        } catch (NoSuchMethodException | SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在经过一次没有准备的面试后,发现自己虽然写了两年的android代码,基础知识却忘的差不多了。这是程序员的大忌,没...
    猿来如痴阅读 2,909评论 3 10
  • 我们这个家,很朴素;我们三个人,很单纯。我们与世无求,与人无争,只求相聚在一起,相守在一起,各自做力所能及的事。 ...
    沉溺窒息阅读 265评论 0 0
  • 为防范民间借贷资金链断裂、金融产品兑付困难、证券投资市场波动等外部风险传递至银行员工,产生负面舆情,近期法律合规部...
    门泊东吴万里船阅读 629评论 0 0
  • 1、模拟演讲学习 2、群内关注服务 从葆婴创业之路以来,一直习惯性的写这样一个日结,在不知不觉的习惯中过的...
    葆婴USANA廖瑜阅读 195评论 0 0
  • 打开了一扇窗,静静的观望。 一个人静静的走着,脚步放的很很慢,仿佛很享受。那眼神毫无波澜的看着窗外的一切,好像所有...
    one丶体阅读 169评论 0 0