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类型的数据
以上纯属个人学习中总结,如有错误,欢迎指正!