js--28

一、反射基础

1. 反射的定义

反射允许在运行时对类的成员变量、构造方法、成员方法等信息进行编程式访问与操作,实现 “解剖” 类的能力。

2. 反射的作用

  • 获取类的完整信息,用于执行后续业务逻辑。
  • 结合配置文件,动态创建对象并调用方法,提升代码灵活性。

3. 获取 Class 对象的三种方式

  1. Class.forName("全类名"):通过全类名加载类,常用于配置文件驱动。
  2. 类名.class:直接获取类的 Class 对象,编译期已知类名时使用。
  3. 对象.getClass():通过对象实例获取其 Class 对象,运行时动态获取。


二、反射操作类成员

1. 构造方法(Constructor)

获取构造方法
  • getConstructors():返回所有公共构造方法数组。
  • getDeclaredConstructors():返回所有构造方法数组(包括私有)。
  • getConstructor(Class<?>... parameterTypes):返回单个指定参数类型的公共构造方法。
  • getDeclaredConstructor(Class<?>... parameterTypes):返回单个指定参数类型的构造方法(包括私有)。
创建对象
  • newInstance(Object... initargs):根据构造方法创建对象。
  • setAccessible(true):取消访问检查,可操作私有构造方法。

2. 成员变量(Field)

获取成员变量
  • getFields():返回所有公共成员变量数组。
  • getDeclaredFields():返回所有成员变量数组(包括私有)。
  • getField(String name):返回指定名称的公共成员变量。
  • getDeclaredField(String name):返回指定名称的成员变量(包括私有)。
操作成员变量
  • set(Object obj, Object value):为对象的成员变量赋值。
  • get(Object obj):获取对象成员变量的值。
  • setAccessible(true):取消访问检查,可操作私有成员变量。

3. 成员方法(Method)

获取成员方法
  • getMethods():返回所有公共成员方法数组(含继承的方法)。
  • getDeclaredMethods():返回所有成员方法数组(不含继承的方法)。
  • getMethod(String name, Class<?>... parameterTypes):返回指定名称和参数类型的公共成员方法。
  • getDeclaredMethod(String name, Class<?>... parameterTypes):返回指定名称和参数类型的成员方法(包括私有)。
调用成员方法
  • invoke(Object obj, Object... args):在对象上调用方法,传入参数并接收返回值。
  • setAccessible(true):取消访问检查,可调用私有方法。

三、动态代理

1. 动态代理的定义

动态代理是一种无侵入式的增强机制,在不修改原始代码的前提下,为对象添加额外功能(如日志、事务、权限控制等)。

2. 创建代理对象的核心方法

使用java.lang.reflect.Proxy类的newProxyInstance方法:

java

运行

public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
  • 参数一:类加载器,用于加载生成的代理类。
  • 参数二:目标对象实现的接口,指定代理对象的行为。
  • 参数三InvocationHandler实例,定义代理对象的增强逻辑。