反射
1. 什么是反射
在运行状态中,对于任意一个类,能够知道这个类的所有属性和方法。对任意一个对象,能调用它的任意一个方法和属性。
要想使用反射,需要获取 类的字节码文件对象。
反射就是把java类中各种成分映射成 java 对象(成员变量、方法、构造、包等信息映射成对象)
当第一次new一个对象时,jvm去磁盘中找到 class 文件,加载到jvm内存中,创建一个 Class 对象(一个类只产生一个Class对象)。则通过这个Class对象就知道了类有哪些方法、哪些成员(私有成员还是受保护的)。
相关的类:
Class类:代表类实体
Field类:类的成员变量/类的属性
Method:类的方法
Constructor:类的构造方法
2. 获取Class对象的方式
①Object类的 getClass() 方法
②任何数据类型(包括基本类型)都有静态 class 属性
③Class类的静态方法 Class.forName(String className)
-------------------------------------------------------------------------------------------------------------------------------------
类加载:
①
Class class = Class.forName(String className)
加载 .class 文件到jvm,执行类的static代码块
②
ClassLoader loader = ClassLoader.getSystemClassLoader();
Class<?> class = loader.loadClass(className);
只加载class到jvm,不执行static代码块
---------------------------------------------------------------------------------------------------------------------------------------
Class类对象的方法:
(1)获取构造
public Constructor[] getConstructors() //获取"公有的"构造方法 public Constructor[] getDeclaredConstructors() //获取所有的构造方法(包括私有、保护、默认、公有) public Constructor getConstructor(Class... parameterTypes) //获取单个"公有的"构造方法 public Constructor getDeclaredConstructor(Class... parameterTypes) //获取单个构造方法
要创建对象,调用 Constructor对象的 newInstance() 方法,如果获取的是有参的构造,则newInstance() 也要传入相应的参数。
获取private构造,不能直接直接用此构造对象newInstance创建对象(可以先调用 setAccessible获取权限,然后调用私有构造创建对象)
(2)获取成员变量
Field[] getFields() //获取所有public字段 Field[] getDeclaredFields() //获取所有public、private、默认、protected字段 Field getField(String fieldName) //获取一个public字段 Field getDeclaredField(String fieldName) //获取任意一个字段
void set(Object obj,Object value) obj:对象 value:为字段设的值
(3)获取方法
Method[] getMethods() //获取所有public方法 Method[] getDeclaredMethods() //获取所有方法 Method getMethod(String name,Class<?>... parameterTypes) //获取一个public方法,name指定名字,后面的参数指定是哪个重载方法 Method getDeclaredMethod(String name,Class<?>... parameterTypes) //获取一个方法
调用方法: Object invoke(Object obj,Object... arg) obj为对象,args为实参
调用静态方法:第一个参数obj传null即可
3. 反射的作用
(1)通过反射运行配置文件内容
用配置文件指定类、方法等,当需要修改功能时,修改配置文件内容为另一个类、方法即可。灵活性更高。