java中的反射机制

1.反射是什么?

  反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性,这种动态获取信息以及动态调用对象的方法的功能称为java语言的反射机制。

2.反射的意义

  ① 通过反射可以使用一个不存在的类,或者以后才存在的类;

  ② 通过反射可以写最顶级的通用代码;

  ③ 通过反射可以访问一个类的私有成员(暴力反射);

3.一个类加载的任务

  当我们第一次使用一个类,该类会被加载,系统会做两件事:

    <1> 该类的字节码文件会被加载到内存中,形成一个类加载区(方法区)

    <2> 会为这个字节码文件创建一个Class对象

4.一个类被加载的时机

  ①创建类的实例

  ②访问一个类或者接口的静态变量或者静态变量被赋值

  ③类的静态方法被调用

  ④使用反射来获取一个类的Class对象

  ⑤初始化某个类的子类

  ⑥直接使用java.exe命令来运行某个主类

5.反射的使用步骤

  获取某个类的Class对象------>得到java文件----->获取内部的属性和方法

图示:

 

5.1 获取Class对象的三种方式

  ①通过类名获取 Student.class

  ②通过对象获取  Student.getClass()

  ③通过类全限定名来获取  Class.forName("pack01.Student")

 

5.2  获取一个类的构造方法:

获取一个类中所有的构造:getConstructors( ) 只能获取public修饰的构造

getConstructor(Class<?>... parameterTypes) 只能获取public修饰的单个构造方法

注意:

直接可以通过Class对象创建对象,不需要去反射它的构造方法  Clazz.newInstance( )

5.3 获取一个类的成员方法

获取一个类中所有的成员方法:getMethods( )只能获取public 修饰的方法

注意:

该方法既可以获取自己的,也可以获取父类的方法

getMethod(String name,Class<?>... parameterTypes)只能获取public修饰的单个方法

5.4 获取一个类的成员变量

    内部还是通过反射get和set方法

  需要设置暴力访问:

    field.setAccessible(true)

5.5 静态方法的反射

注意:

① 静态方法不需要创建对象,就可以调用,参数里面写null

② 变参方法的反射和数组方法的反射一样

6.案例

   集合中泛型的擦除,一个Integer类型的集合存储其他非Integer类型的数据

 以上纯属个人学习中总结,如有错误,欢迎指正!

 

posted @ 2017-10-19 15:33  小明唯一ID  阅读(368)  评论(0编辑  收藏  举报