反射

首先明白:

1,任何类都是Class的实例对象

2,new对象是静态加载,在编译时刻就加载 可能 使用的类,可能会出现程序在运行阶段,没有用到Class A,该类编译不通过,那么程序启动会报编译错误。

  在运行时动态加载Class.forName("classPath")能巧妙的避免出现这样的问题。

3,类类型,即是Class的对象,如String.class(其实是编译后的字节码文件),获取的三种办法:

  a,Class c = String.class;

  b,Class c = 对象.getClass();

  c,Class c = Class.forName("classPath");

反射:可以在巧妙的躲避编译不通过的问题

  //获取类类型

  Class c = ArrayList.class;

  //获取一个方法,通过方法名称和paramsType...获取

  Method m = c.getMethod("add",String.class);

  //方法反射

  Object o = m.invoke(new ArrayList(),"test");

例如:java中集合的泛型,泛型只在编译阶段有效,为了防止错误输入。

  ArrayList list = new ArrayList();

  ArrayList<String> list1 = new ArrayList<String>();

  System.out.println(list.getClass() == list1.getClass())   //结果为true

  说明在运行过程泛型是没意义的

  

  

原文地址:https://www.cnblogs.com/dfdi33/p/8953880.html