Java动态代理

一、Java代理分为静态代理和动态代理两大类

1)静态代理

    优点:代码结构简单,较容易实现;

    缺点:无法适配所有代理场景,需求增加,需要修改代理类。

2)动态代理

    优点:能够动态适配特定的代理场景,扩展性好;

    缺点:动态代理需要利用反射机制和动态生成字节码,导致其性能会比静态代理稍差一些。

二、代理模式

    定义:给目标对象提供一个代理对象,代理对象包含该目标对象,并控制对该目标对象的访问。

    目的:

        通过代理对象的隔离,可以在对目标对象访问前后增加额外的业务逻辑,实现功能增强。

        通过代理对象访问目标对象,可以防止系统大量直接对目标对象进行不正确地访问,出现不可预测的后果。

    场景描述:A想购买香港某品牌的手表,但在国内无货源,亲自去又要花费时间,而B正在香港玩耍,A和B又是好朋友,于是A想多出5%的价格找B代购...

    代码实现如下结构:

    1)定义售卖手表的接口

售卖手表接口

    2)定义售卖手表提供商

售卖手表提供商

    3)定义B代理类

B代理购买手表

    4)A购买手表实现

main方法下的实现和结果展示

    综上,实现代理模式,需要以下步骤:

    【定义真是对象和代理对象的公共接口】

    【代理对象内部保存对真实目标对象的引用】

    【不可直接访问目标对象】

三、常见动态代理实现

1)JDK Proxy

    JDK Proxy 是 JDK 提供的一个动态代理机制,它涉及到两个核心类,分别是Proxy和InvocationHandler。

    实现代理操作如下:

代理工厂需要实现InvocationHanlder接口并实现其invoke()方法

    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类。

    实现代理操作如下:

B代理购买手表

intercept() 方法涉及到 4 个参数:

    Object o:被代理对象

    Method method:被拦截的方法

    Object[] objects:被拦截方法的所有入参值

    MethodProxy methodProxy:方法代理,用于调用原始的方法

购买实现操作
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容