一、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 {@Overridepublic 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);}
}

CGLIB 动态代理使用相关推荐

  1. 你必须会的 JDK 动态代理和 CGLIB 动态代理

    来自:ytao 我们在阅读一些 Java 框架的源码时,基本上常会看到使用动态代理机制,它可以无感的对既有代码进行方法的增强,使得代码拥有更好的拓展性.通过从静态代理.JDK 动态代理.CGLIB 动 ...

  2. 代理详解 静态代理+JDK/CGLIB 动态代理实战

    1. 代理模式 代理模式是一种比较好理解的设计模式.简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对 ...

  3. 深入理解Java Proxy和CGLIB动态代理原理

    点击上方关注,每天进步一点点 动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询.测试框架的后端mock.RPC,Java注解对象获取等.静态代理的代理关系在编译 ...

  4. jdk动态代理和cglib动态代理的区别

    一.原理区别: java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理. 而cglib动态代理是利用asm开源包,对代理对象类的class文件 ...

  5. jdk动态代理实例和cglib动态代理实例_CGLib 动态代理 原理解析

    JDK 动态代理实现与原理 首先来看一段CGLib代理的测试代码(MethodInterceptor的测试, 其他类型这里不做展开了). Util类的代码在后面给出的码云片段中 public 下面的输 ...

  6. Java Proxy和CGLIB动态代理原理

    动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询.测试框架的后端mock.RPC,Java注解对象获取等.静态代理的代理关系在编译时就确定了,而动态代理的代理关 ...

  7. spring框架中JDK和CGLIB动态代理区别

    转载:https://blog.csdn.net/yhl_jxy/article/details/80635012 前言 JDK动态代理实现原理(jdk8):https://blog.csdn.net ...

  8. cglib动态代理jar包_代理模式详解:静态代理+JDK/CGLIB 动态代理实战

    1. 代理模式 代理模式是一种比较好的理解的设计模式.简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标 ...

  9. 什么是代理模式?代理模式有什么用?通过一个小程序分析静态代理和动态代理。自己简单实现动态代理。JDK动态代理和CGLIB动态代理的区别。

    1. 代理模式有什么用 ①功能增强,在实现目标功能的基础上,又增加了额外功能.就像生活中的中介一样,他跟两边客户会有私下的交流. ②控制访问,代理不让用户直接和目标接触.就像中间商一样,他们不会让我们 ...

  10. jdk动态代理与cglib动态代理--InvocationHandler--MethodInterceptor

    动态代理是为了实现Aop编程(不修改类源码,类方法执行前后,自定义增强处理, 日志 拦截等等),代理的是类对象 一.jdk动态代理 被代理的类需要实现接口,针对接口的代理,通过生成一个实现了接口的动态 ...

最新文章

  1. Excel技巧之——英文大小写转换(转)
  2. 如何查看阵列卡的队列深度
  3. linux之xargs详解
  4. AutoComplete的字典建立和单词查找算法实现
  5. python爬虫网络请求超时_python总urllib,伪装,超时设置,异常处理的方法
  6. SpringBoot实现定时器定时处理任务
  7. windows消息机制深入详解-1
  8. 【nodejs原理源码赏析(9)】用node-ssh实现轻量级自动化部署
  9. R语言快速学习第二部分(有其他语言基础)
  10. java编译sql存过_SQL SERVER 临时表导致存储过程重编译(recompile)的一些探讨
  11. 中国输卵管癌治疗行业市场供需与战略研究报告
  12. 2006年 上半年 网络管理员 下午试卷
  13. mysql 编译安装详解_MySQL编译安装详解
  14. 计算机打印机墨水更换方法,怎么看打印机有没有墨?老司机教你查看打印机墨水量方法 (全文)...
  15. 关于ssh整合后struts2拦截器不起作用(blog-1)
  16. 2018界面情感化设计,拒绝冷冰冰的人机交流
  17. DHCP原理及DHCP服务器的防攻击手段
  18. ES 7.0.1安装head和sql插件报错处理
  19. 羽毛球社团php,羽毛球兴趣小组计划
  20. (flutter)黑苹果系统 Xcode iOS flutter 跑通真机模拟器 此oc clover 彼oc swift

热门文章

  1. Linux Block Driver - 1
  2. GRE over IPSec 主备双链路冗余配置
  3. 省市县地区编码五级联东2021年版sql
  4. fanuc机器人仿真软件roboguide-新建工程文件
  5. 开心盒子助手3.0版|开心盒子助手工具3.0电脑版
  6. mhdd测试hdd硬盘软件,HDD坏道检测软件比较(DiskGenius/HdTunePro/MHDD等)
  7. 雨滴win7计算机路径,win7系统设置雨滴桌面(Rainmeter)开机自启动的操作方法
  8. 杭州银行面试题【杭州多测师】【杭州多测师_王sir】
  9. C语言从入门到不放弃---编程环境的搭建到上手写代码
  10. 遇到This application failed to start becauseit could not find...的问题