当前位置: 首页 > news >正文

CGLIB 动态代理使用

一、CGLIB

Cglib是一个强大的,高性能,高质量的代码生成类库。它可以在运行期扩展JAVA类与实现JAVA接口。其底层实现是通过ASM字节码处理框架来转换字节码并生成新的类。大部分功能实际上是ASM所提供的,Cglib只是封装了ASM,简化了ASM操作,实现了运行期生成新的class。

运行时动态的生成一个被代理类的子类(通过ASM字节码处理框架实现),子类重写了被代理类中所有非 final 的方法。在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势植入横切逻辑。

Cglib优缺点:

优点:JDK动态代理要求被代理的类必须实现接口,当需要代理的类没有实现接口时Cglib代理是一个很好的选择。实现扩展功能,对我们方法实现增强、安全性、冗余性提高代码复用机制。

缺点:对于被代理类中的final方法,无法进行代理,因为子类中无法重写final函数

注意:jdk7 开始 jdk 动态代理效率比 cglib 要高。

二、CGLIB代理实现

实现 MethodInterceptor 接口的 intercept 方法后,所有生成的代理方法都调用这个方法。
intercept方法的具体参数有

  1. obj 目标类的实例
  2. method 目标方法实例(通过反射获取的目标方法实例)
  3. args 目标方法的参数
  4. proxy 代理类的实例
    该方法的返回值就是目标方法的返回值。
@Slf4j
public class CglibMethodInterceptor implements MethodInterceptor {
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        log.info("<目标方法之前开始执行....>");
        Object result = proxy.invokeSuper(obj, args);
        log.info("<目标方法之后开始执行....>");
        return result;
    }
}

创建目标代理对象:

@Slf4j
public class TargetObject {
    
    public String exec(String param) {
        log.info("<param:{}>", param);
        return "ok";
    }
}

使用 CGLIB 代理目标方法:

public class Test {
    public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(TargetObject.class);
        enhancer.setCallback(new CglibMethodInterceptor());
        TargetObject targetObject = (TargetObject) enhancer.create();
        String result = targetObject.exec("ABC");
        System.out.println(result);
    }
}

在这里插入图片描述

相关文章:

  • Revit SDK:CreateFillPattern 创建填充样式
  • 当mybatisPlus与tk.mybatis遇到更新
  • sp.coo_matrix(), sp.eye()
  • linux虚拟机未建分区的情况下对磁盘进行扩容
  • 猿创征文|【数据结构】牛客网刷题
  • 【函数式编程】Java函数式编程学习
  • 基于springboot,vue旅游信息推荐系统
  • SSLError(MaxRetryError(‘HTTPSConnectionPool(host=\‘repo.anaconda.com\‘, port
  • vs生成dll且被java通过jna调用
  • DDD - 六边形架构和CQRS架构
  • 宠物寄养小程序实战教程02
  • 【计算机网络】运输层习题(谢希仁)(1)
  • 微信小程序抓包-夜神模拟器结合BurpSuite抓包(可用于现在最新版本微信)
  • SAR/毫米波雷达 论文阅读 | Freehand, Agile, and High-Resolution Imaging, IEEE Access 2019
  • 神经网络一词在英文中是,网络词神经质什么意思
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • DataBase in Android
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • ES6之路之模块详解
  • JavaScript 奇技淫巧
  • JS+CSS实现数字滚动
  • Vue 动态创建 component
  • vue-router的history模式发布配置
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • windows-nginx-https-本地配置
  • 安装python包到指定虚拟环境
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 从零开始在ubuntu上搭建node开发环境
  • 记一次用 NodeJs 实现模拟登录的思路
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 理清楚Vue的结构
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 每天一个设计模式之命令模式
  • 如何解决微信端直接跳WAP端
  • 如何胜任知名企业的商业数据分析师?
  • 问题之ssh中Host key verification failed的解决
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • 2017年360最后一道编程题
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • # 达梦数据库知识点
  • #if #elif #endif
  • ( 10 )MySQL中的外键
  • (007)XHTML文档之标题——h1~h6
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (多级缓存)缓存同步
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (理论篇)httpmoudle和httphandler一览
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐