动态代理定义
在程序运行时,通过反射机制动态地创建一个代理类。
动态代理的几点注意:
- 动态代理的体现:程序开始执行时是没有代理类的,在程序运行时,java利用反射机制动态生成代理类的实例。
- jdk技术支持:java在java.lang.reflect包中提供一个类和一个接口帮助我们创建和使用代理类实例,类是:
Proxy类
,接口是invocationHandler接口
。 - 两种代理类的模式区别:静态模式要求为程序中所有需要被访问的目标创建代理类,如果有100个代理目标,就需要创建100个代理类,让代理类直接访问目标对象。
举一个动态代理的栗子
1. 首先画栗子的类图
2. 具体的例子
Subject类
TargetSubejct类
DynamicInvocationHandler类
动态代理代码流程
总结动态dialing的流程
-
- jdk获取
TargetSubejct
上的所有接口列表,确定要生成的代理类类名。
- jdk获取
-
- jdk根据接口信息和类名动态创建类的字节码。
-
- 通过类加载器将字节码转换成代理类
class
对象。
- 通过类加载器将字节码转换成代理类
-
- 创建
InvocationHandler
的实例handler
,用来处理对被代理类的所有方法的访问。
- 创建
-
- 通过反射获取代理类中以
handler
类为参数的构造。
- 通过反射获取代理类中以
-
- 使用构造创建代理类的实例。
-
- 用户通过代理类的实例,调用接口里的方法,将方法参数和该方法传入
handler
的invoke
方法
- 用户通过代理类的实例,调用接口里的方法,将方法参数和该方法传入
-
handler
的invoke
方法里,调用method.invoke(subject, args)
,用来执行目标对象subject
里参数为args
的方法method
-
- 目标对象
targetSubject
执行具体业务逻辑,如果有返回值,就将返回传值会给handler
- 目标对象