一、Java代理分为静态代理和动态代理两大类
1)静态代理
优点:代码结构简单,较容易实现;
缺点:无法适配所有代理场景,需求增加,需要修改代理类。
2)动态代理
优点:能够动态适配特定的代理场景,扩展性好;
缺点:动态代理需要利用反射机制和动态生成字节码,导致其性能会比静态代理稍差一些。
二、代理模式
定义:给目标对象提供一个代理对象,代理对象包含该目标对象,并控制对该目标对象的访问。
目的:
通过代理对象的隔离,可以在对目标对象访问前后增加额外的业务逻辑,实现功能增强。
通过代理对象访问目标对象,可以防止系统大量直接对目标对象进行不正确地访问,出现不可预测的后果。
场景描述:A想购买香港某品牌的手表,但在国内无货源,亲自去又要花费时间,而B正在香港玩耍,A和B又是好朋友,于是A想多出5%的价格找B代购...
代码实现如下结构:
1)定义售卖手表的接口

2)定义售卖手表提供商

3)定义B代理类

4)A购买手表实现

综上,实现代理模式,需要以下步骤:
【定义真是对象和代理对象的公共接口】
【代理对象内部保存对真实目标对象的引用】
【不可直接访问目标对象】
三、常见动态代理实现
1)JDK Proxy
JDK Proxy 是 JDK 提供的一个动态代理机制,它涉及到两个核心类,分别是Proxy和InvocationHandler。
实现代理操作如下:

invoke() 方法有3个参数:
Object proxy:代理对象
Method method:真正执行的方法
Object[] agrs:调用第二个参数 method 时传入的参数列表值

2)CGLIB
导入第三方依赖:
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<version>3.3.0</version>
<scope>test</scope>
</dependency>
CGLIB 代理中有两个核心的类:MethodInterceptor接口 和 Enhancer类。
实现代理操作如下:

intercept() 方法涉及到 4 个参数:
Object o:被代理对象
Method method:被拦截的方法
Object[] objects:被拦截方法的所有入参值
MethodProxy methodProxy:方法代理,用于调用原始的方法
