Java 反射&动态代理
2025.04.29
Java 反射&动态代理
一、反射
1.1 反射的概念
- 反射允许对成员变量、成员方法和构造方法的信息进行编程访问

1.2 获取class对象的三种方式
- Class.forName(“全类名”);
- 在源代码阶段使用
- 最为常用
- 类名.class
- 在加载阶段使用
- 一般更多的是当做参数进行传递
- 对象.getClass();
- 在运行阶段使用
- 当我们已经有了这个类的对象时,才可以使用

示例:
1 | public class Main { |
1.3 反射获取构造方法
- Class类中用于获取构造方法的方法
- Constructor<?>[] getConstructors():获取所有公共构造方法对象的数组
- Constructor<?>[] getDeclaredConstructors():获取所有构造方法对象的数组,包括私有的
- Constructor<T> getConstructor(Class<?>… parameterTypes):获取单个公共构造方法
- Constructor<T> getDeclaredConstructor(Class<?>… parameterTypes):获取单个构造方法,包括私有的
- Constructor类中用于创建对象的方法
- T newInstance(Object… initargs):根据指定的构造方法创建对象
- setAccessible(boolean flag):设置为true表示取消访问检查
示例:
1 | // Student类 |
1 | import java.lang.reflect.Constructor; |
1.4 反射获取成员变量
- Class类中用于获取成员变量的方法
- Field[] getFields():获取所有公共成员变量对象的数组
- Field[] getDeclaredFields():获取所有成员变量对象的数组,包括私有的
- Field getField(String name):获取单个公共成员变量对象
- Field getDeclaredField(String name):获取单个成员变量对象,包括私有的
- Field类中用于创建对象的方法
- Object get(Object obj):获取指定对象的成员变量值
- void set(Object obj, Object value):设置指定对象的成员变量值
示例:
1 | // Student类 |
1 | import java.lang.reflect.Field; |
1.5 反射获取成员方法
- Class类中用于获取成员方法的方法
- Method[] getMethods():获取所有公共成员方法对象的数组,包括父类的所有公共方法
- Method[] getDeclaredMethods():获取所有成员方法对象的数组,包括私有的
- Method getMethod(String name, Class<?>… parameterTypes):获取单个公共成员方法对象
- Method getDeclaredMethod(String name, Class<?>… parameterTypes):获取单个成员方法对象,包括私有的
- Method类中用于创建对象的方法
- Object invoke(Object obj, Object… args):调用指定对象的成员方法
- 参数一:用obj对象调用该方法
- 参数二:调用方法的传递的参数(如果没有就不写)
- 返回值:方法的返回值(如果没有就不写)
1.6 反射的作用
- 获取一个类里面所有的信息,获取到了之后,再执行其他的业务逻辑
- 结合配置文件,动态地创建对象并调用方法
1.7 练习1:保存信息
- 需求:对于任意一个对象,都可以把对象所有的字段名和值保存到文件中去

1 | import java.io.*; |
1.8 练习2:跟配置文件结合动态创建
- 需求:反射可以跟配置文件结合的方式,动态创建对象,并调用方法
1 | // Student类 |
1 | import java.io.FileInputStream; |
1 | classname=Student |
二、动态代理
2.1 动态代理的概念
- 动态代理是指在运行时创建一个代理对象,并将其与目标对象关联起来,从而实现对目标对象的访问和控制。动态代理可以用于实现AOP(面向切面编程)、权限控制、事务管理等功能。动态代理的实现通常依赖于Java反射机制和接口的使用。
- 特点:无侵入式地给代码增加额外的功能
- 代理是一个接口,内部是对象要被代理的方法

2.2 动态代理的实现步骤
- java.lang.reflect.Proxy类:提供了为对象产生代理对象的方法:
- public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
- loader:用于指定用哪个类加载器,去加载生成的代理类
- interfaces:指定接口,这些接口用于指定生成的代理长什么样,也就是有哪些方法
- h:用来指定生成的代理对象要干什么事情
示例:
1 | // BigStar类 |
1 | // Star接口 |
1 | // ProxyUtil类 |
1 | // Main类 |
