专栏首页Java小王子Java常用Cglib代理模式
原创

Java常用Cglib代理模式

 上面的静态代理和动态代理模式都是要求目标对象实现一个接口或者多个接口,但是有时候目标对象只是一个单独的对象,并没有实现任何的接口,这个时候就可以使用构建目标对象子类的方式实现代理,这种方法就叫做:Cglib代理。   Cglib代理,也叫作子类代理,它是在内存中构建一个子类对象从而实现对目标对象功能的扩展。

  • Cglib是一个强大的高性能的代码生成包,它可以在运行期扩展java类与实现java接口。它广泛的被许多AOP的框架使用,例如Spring AOP和synaop,为他们提供方法的interception(拦截)
  • Cglib包的底层是通过使用字节码处理框架ASM来转换字节码并生成新的子类
  • 代理的类不能为final,否则报错;目标对象的方法如果为final/static,那么就不会被拦截。

代码示例: 目标对象类:UserDao.java

    /**
     * 目标对象,没有实现任何接口
     */
    public class UserDao {

        public void save() {
            System.out.println("----已经保存数据!----");
        }
    }

Cglib代理工厂:ProxyFactory.java

    /**
     * Cglib子类代理工厂
    * 对UserDao在内存中动态构建一个子类对象
    */
    public class ProxyFactory implements MethodInterceptor{
         //维护目标对象
        private Object target;

        public ProxyFactory(Object target) {
            this.target = target;
        }

       //给目标对象创建一个代理对象
        public Object getProxyInstance(){
            //1.工具类
            Enhancer en = new Enhancer();
           //2.设置父类
            en.setSuperclass(target.getClass());
            //3.设置回调函数
            en.setCallback(this);
            //4.创建子类(代理对象)
            return en.create();
        }

        @Override
        public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
            System.out.println("开始事务...");
            //执行目标对象的方法
            Object returnValue = method.invoke(target, args);
            System.out.println("提交事务...");
            return returnValue;
        }
    }

测试类:

    /**
     * 测试类
     */
    public class App {

        @Test
        public void test(){
            //目标对象
            UserDao target = new UserDao();

            //代理对象
            UserDao proxy = (UserDao)new ProxyFactory(target).getProxyInstance();

            //执行代理对象的方法
            proxy.save();
        }
    }

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

关注作者,阅读全部精彩内容

我来说两句

0 条评论
登录 后参与评论

推荐阅读

  • 基于 BPF 分析网络抖动问题的实践

    随着云计算网络环境的日益复杂多样,偶发性网络抖动问题已成为云上业务的一大困扰。然而,在应对这类问题时,基于内核内部统计信息及网络包捕获的传统网络性能工具(sar、ss、tcpdump 等)显得捉襟见肘,而基于 BPF 开发的追踪工具能够起到很好的互补作用。BPF 强大的系统级观测能力,更深更细的辅助性能分析与问题定位工作,尤其适用于解决偶发性的网络抖动问题。本文将以一个实际业务案例入手,介绍如何基于 BPF 追踪技术定位并解决几百万分之一概率的请求超时与网络抖动问题,期望能够对感兴趣的读者有所启发。

    rockyxing
  • Flink 实践教程:入门9-Jar作业开发

    流计算 Oceanus 是大数据产品生态体系的实时化分析利器,是基于 Apache Flink 构建的具备一站开发、无缝连接、亚秒延时、低廉成本、安全稳定等特点的企业级实时大数据分析平台。流计算 Oceanus 以实现企业数据价值最大化为目标,加速企业实时化数字化的建设进程。

    吴云涛
    流计算 OceanusFlink
  • 基于腾讯云cos的图床教程

    那么问题来了,目前网上有些程序对接腾讯云的cos需要在程序里面录入密钥信息不安全怎么办,那么为了安全应该怎么做呢?我在查找资料的时候知道了腾讯云还有个COSFS的东西,通过这个软件就可以把你的cos盘挂载到你主机的目录上。注意:该方法不适合那种高并发的需要进行大量IO读写的操作。COSFS 基于 S3FS 构建, 读取和写入操作都经过磁盘中转,仅适合挂载后对文件进行简单的管理,不支持本地文件系统的一些功能用法。

    青阳
  • Elasticsearch 7.10.1压测对比(WTF? Intel肝不过AMD?)

    本文描述问题及解决方法同样适用于 腾讯云 Elasticsearch Service(ES)。

    岳涛
    大数据大数据解决方案ElasticsearchService压力测试
  • Istio 实践手册 |服务网格框架对比

    当前,业界主要有以下主要几种 Service Mesh 框架,下面进行详细的说明及对比。

    xcbeyond
    容器服务 TKE
  • 基于流计算 Oceanus 和 Elasticsearch Service 构建百亿级实时监控系统

    在后移动互联网时代,良好的用户体验是增长的基础,而稳定的使用体验则是用户体验的基础。大型的互联网公司,尤其是面向 C 端客户的公司,对业务系统稳定性的要求越来越高,因此对线上问题发现和处理的速度要求通常是分钟级的。比如滴滴等出行公司,打车服务停摆 10 分钟都会导致导致乘客、司机大规模投诉,不仅造成经济损失,而且严重平台商誉和用户口碑。

    三余鱻生
    流计算 OceanusFlinkElasticsearchService实时监控大数据解决方案
  • 【技术种草】如何白嫖一个动态网站

    在国内上线一个网站,域名还必须得备案,光是域名备案的话还的几个星期,整个流程下来,上线一个网站可能要个把月。若选择云服务器,各大云平台新用户首年还有优惠,次年想要续费得花上不小成本。本文将介绍如何用最小的成本和最短时间开发部署一个动态网站。

    狂奔的小马
    云服务器域名注册JavaScriptNode.js
  • 【技术种草】介绍一款开源电商网站的购物车添加功能的实现

    目前电商领域有两款比较出名的开源电商网站解决方案,分别是基于 Angular 开发框架,代号为 Spartacus 的开源项目,以及基于 Vue 的 Vue Storefront.

    Jerry Wang
    AngularJS电商
  • 【技术种草】手把手教大家用97元撸到一个10年域名

    wo.
  • python爬虫前奏【成信笔记】

    1.当用户在浏览器的地址栏中输入一个URL并按回车键之后,浏览器会向HTTP服务器发送HTTP请求。HTTP请求主要分为"Get"和"Post"两种方法。

    用户8870936
    Python云加俱乐部

扫码关注云+社区

领取腾讯云代金券