Java动态代理设计模式

主要介绍Java中两种常见的动态代理方式:JDK原生动态代理和CGLIB动态代理。

什么是代理模式
就是为其他对象提供一种代理以控制对这个对象的访问。代理可以在不改动目标对象的基础上,增加其他额外的功能(扩展功能)。

代理模式角色分为 3 种:

Subject(抽象主题角色):定义代理类和真实主题的公共对外方法,也是代理类代理真实主题的方法;
RealSubject(真实主题角色):真正实现业务逻辑的类;
Proxy(代理主题角色):用来代理和封装真实主题;
如果根据字节码的创建时机来分类,可以分为静态代理和动态代理:

所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和真实主题角色的关系在运行前就确定了。
而动态代理的源码是在程序运行期间由JVM根据反射等机制动态的生成,所以在运行前并不存在代理类的字节码文件

静态代理的问题
如果我们需要计算SDK中100个方法的运行时间,同样的代码至少需要重复100次,并且创建至少100个代理类。往小了说,如果Cat类有多个方法,我们需要知道其他方法的运行时间,同样的代码也至少需要重复多次。因此,静态代理至少有以下两个局限性问题:

如果同时代理多个类,依然会导致类无限制扩展
如果类中有多个方法,同样的逻辑需要反复实现
所以,我们需要一个通用的代理类来代理所有的类的所有方法,这就需要用到动态代理技术。

动态代理实现过程
通过getProxyClass0()生成代理类。JDK生成的最终真正的代理类,它继承自Proxy并实现了我们定义的接口.
通过Proxy.newProxyInstance()生成代理类的实例对象,创建对象时传入InvocationHandler类型的实例。
调用新实例的方法,即原InvocationHandler类中的invoke()方法。
代理对象不需要实现接口,但是目标对象一定要实现接口,否则不能用动态代理

posted @ 2020-12-06 14:33  陈小伙子  阅读(76)  评论(0编辑  收藏  举报