JAVA 反射
目录什么是JAVA反射
- 就是在运行时候可以动态的获取成员变量,方法。动态调用该类的方法。被称之为JAVA反射
- 要使用该类的反射,必须获取到该类的字节码对象.解剖该类就要使用到Class类中的方法。所以先要获取到每一个字节码文件对应的Class类型的对象。
- 反射就是把JAVA类中的各种成分映射成一个个java对象。
- 例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象
类的加载过程
- Class 对象的由来是将clas文件读入内存,并为之创建一个Class对象。
Class 详解
- Class 类的实例表示正在运行的Java 应用程序中的类和接口。也是jvm中有N多的实例每个类都有该Class对象(包括基本数据类型)
- Class 没有公共构造方法。Class 对象是在加载类时由Java虚拟机调用类加载器中的fefineClass方法自动构造的。也就是不需要我们去处理创建对象,JVM已经帮我们创建好了。
- 获取Class对象的三种方式
- Object -> getClass 方法
- 任何对象包含基本数据类型都有一个静态的class的属性
- 通过Class类的静态方法 forName 指定类的所在的全路径(包含包名和类名)
其中1是因为Object类中的getClass方法、因为所有类都继承Object类。从而调用Object类来获取
一般使用第三种,第一种基本已经拿到了对象,无需在反射; 第二种需要显示导入包,无包路径则编译报错,强依赖;第三种 传入一个字符串 可以从配置文件中读取 方便
在运行期间,一个类,只有一个Class对象产生。 - 获取构造
- 获取公有
- 获取私有 私有方法需要 con.setAccessible(true)
- 支持批量获取
- newInstance是 Constructor类的方法(管理构造函数的类) 返回的是Object类
- 获取成员变量并调用
- Field[] getFields()获取所有的公有字段
- Field[] getDeclaredFields() 获取所有字段,包括:私有、受保护、默认、公有;
- Field getField(String fieldName) 获取某个公有的字段
- Field getDeclaredField(String fieldName):获取某个字段(可以是私有的)
- 设置字段的值 ield --> public void set(Object obj,Object value): obj:要设置的字段所在的对象; value:要为字段设置的值
- 获取成员方法并调用
- Method[] getMethods():获取所有"公有方法";(包含了父类的方法也包含Object类)
- Method[] getDeclaredMethods():获取所有的成员方法,包括私有的(不包括继承的)
- Method getMethod(String name,Class<?>... parameterTypes): name : 方法名 Class ... : 形参的Class类型对象
- Method getDeclaredMethod(String name,Class<?>... parameterTypes)
- 调用方法:public Object invoke(Object obj,Object... args): obj : 要调用方法的对象 args:调用方式时所传递的实参
- 反射方法使用场景
- 通过反射运行配置文件内容 当类发生变化只需要修改配置文件 无需修改代码.
- 通过反射越过泛型检查