反射机制
- 当一个类被加载进内存后,都会相应的有一个字节码文件(里面有类的信息)对象
- 我们可以通过去剖析这个类的构成,还能调用该类中的功能
- 想要通过反射去调用类中的功能和属性,那必须的先要得到该类对象的字节码文件对象
反射概述
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
获取class文件对象的三种方式
- Object类的getClass()方法
- 静态属性class
- Class类中静态方法forName()
成员变量Field类
获取所有成员变量
public Field[] getFields()
获取所有的公共成员变量包含从父类继承过来的
public Field[] getDeclaredFields()
获取所有的成员变量 包含私有的 也包含从父类继承过来的成员变量
获取单个成员变量
public Field getField(String name)
public Field getDeclaredField(String name)
参数是字段名,即成员变量的名字
给成员变量赋值
获取的成员变量.setAccessible(true)
取消语法检查 私有的外界不能直接访问
public void set(Object obj, Object value)
obj: 表示的就是对象,clazz.newInstance()
value: 表示的意思就是要具体赋的值
public Object get(Object obj)
通过字段对象获取字段字
构造方法 Constructor类
获取所有构造方法
public Constructor<?>[] getConstructors()
获取所有的构造方法不包含私有的
public Constructor<?>[] getDeclaredConstructors()
获取所有的构造方法 包括私有的
获取单个构造方法
public Constructor<T> getConstructor(Class<?>... parameterTypes)
获取单个的构造方法 不包含私有的
参数:就是你构造方法中的参数类型的 Class 类型,不填就是无参构造
public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
获取单个的构造方法包含私有的
创建对象
获取的构造.setAccessible(true) ;
取消语法检查不然会报错 因为私有的外界不能直接访问
值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查
public T newInstance()
调用构造方法的时候传递的具体的参数
参数代表你要传的内容
通过空参创建对象【方式二】
clazz.newInstance()
成员方法Method类
获取所有成员方法
public Method[] getMethods()
获取所有的公共的成员方法不包含私有的 包含从父类继承过来的过来的公共方法
public Method[] getDeclaredMethods()
获取自己的所有成员方法 包含私有的,不包含父类的
获取单个成员方法
参数1: 方法名称 参数2:方法形参的class 对象【类型.class】
public Method getMethod(String name,Class<?>... parameterTypes)
获取单个的方法 不包含私有的
public Method getDeclaredMethod(String name,Class<?>... parameterTypes)
获取单个方法包括私有的
调用方法
获取的成员方法.setAccessible(true)
取消语法检查 私有的外界不能直接访问
public Object invoke(Object obj, Object... args)
obj: 表示的是对象,clazz.newInstance()
args: 表示的是调用该方法的时候传递的具体的参数
Object: 返回的是方法执行完毕以后的结果