反射的基本理解
反射本质就是操作构造方法、成员变量、成员方法
利用另一种方式去获取一个类的对象、调用类中的方法、使用类中的成员变量。
反射是基于正射。
正射: 对象.方法(实际参数)
反射: 方法对象.invoke(对象,实际参数)
获取一个类的字节码对象:
-
获取一个类的字节码对象 -> Class 类的类字节码对象中封装了类中的构造方法、成员变量、成员方法
-
根据字节码对象获取类中相应的成员对象
根据字节码对象获取类中 构造方法的对象 -> Constructor
根据字节码对象获取类中 成员方法的对象 -> Method
根据字节码对象获取类中 成员变量的对象 -> Field -
根据不同的成员对象完成不同的功能
构造方法对象 -> 创建此类的对象
成员变量对象 -> 赋值、获取值
成员方法对象 -> 调用方法获取一个类的字节码对象的三种方法:
1、对象.getClass() -> 这个对象所在类的字节码对象
Class getClass():来自Object类
2、类型.class -> 类型的名称.class 可以获取到此类型的字节码对象
Class clazz = String.class;
Class clazz = int.class;
Class clazz = Student.class;
3、Class.forName("类的全类名"); -> 通过一个Class的静态方法获取一个类的字节码对象
Class clazz = Class.forName("java.lang.String");
Class clazz = Class.forName("com.itheima.Student");
反射获取 Constructor
通过class对象 获取一个类的构造方法
//通过指定的参数类型, 获取指定的单个构造方法 getConstructor(参数类型的class对象数组)
Person(String name,int age)
//得到这个构造方法的代码如下:
Constructor c = p.getClass().getConstructor(String.class,int.class);
// 获取构造方法数组
getConstructors();
// 获取所有权限的单个构造方法
getDeclaredConstructor(参数类型的class对象数组)
// 获取所有权限的构造方法数组
getDeclaredConstructors();
Constructor 创建对象
// 调用这个构造方法, 把对应的对象创建出来
// 参数: 是一个Object类型可变参数, 传递的参数顺序 必须匹配构造方法中形式参数列表的顺序
newInstance(Object... para)
// 如果flag为true 则表示忽略访问权限检查 !(可以访问任何权限的方法)
setAccessible(boolean flag)
反射获取 Method
通过class对象 获取一个类的方法
// 根据参数列表的类型和方法名, 得到一个方法(public修饰的)
getMethod(String methodName , class.. clss)
// 得到一个类的所有方法 (public修饰的)
getMethods();
// 根据参数列表的类型和方法名, 得到一个方法(除继承以外所有的:包含私有, 共有, 保护, 默认)
getDeclaredMethod(String methodName , class.. clss)
// 得到一个类的所有方法 (除继承以外所有的:包含私有, 共有, 保护, 默认)
getDeclaredMethods();
Method 执行方法
/**
调用方法
参数1. 要调用方法的对象
参数2. 要传递的参数列表
*/
invoke(Object o,Object... para) :
// 获取方法的方法名称
getName()
// 获取方法的方法名称
setAccessible(boolean flag)
反射获取 Field
通过class对象 获取一个类的属性
// 根据属性的名称, 获取一个属性对象 (所有属性)
getDeclaredField(String filedName)
// 获取所有属性
getDeclaredFields()
// 根据属性的名称, 获取一个属性对象 (public属性)
getField(String filedName)
// 获取所有属性 (public)
getFields()
Field 属性的对象类型 常用方法:
// 参数: 要获取属性的对象 获取指定对象的此属性值
get(Object o);
// 参数1. 要设置属性值的 对象
// 参数2. 要设置的值 设置指定对象的属性的值
set(Object o , Object value);
// 获取属性的名称
getName();
// 如果flag为true 则表示忽略访问权限检查 !(可以访问任何权限的属性)
setAccessible(boolean flag);
通过反射获取注解信息
获取类/属性/方法的全部注解对象
Annotation[] annotations01 = Class/Field/Method.getAnnotations();
for (Annotation annotation : annotations01) {
System.out.println(annotation);
}
根据类型获取类/属性/方法的注解对象
注解类型 对象名 = (注解类型) c.getAnnotation(注解类型.class);
内省 Introspector
基于反射 , java所提供的一套应用到JavaBean的API
Java提供了一套java.beans包的api , 对于反射的操作, 进行了封装
获取Bean类信息
// 通过传入的类信息, 得到这个Bean类的封装对象
BeanInfo getBeanInfo(Class cls)
获取bean类的 get/set方法 数组
// 常用的方法:
MethodDescriptor[] getPropertyDescriptors():
MethodDescriptor
// 获取一个get方法
Method getReadMethod();
// 获取一个set方法
Method getWriteMethod();
评论区