Cglib和Jdk代理


前言

比较基础的知识点,或许非科班出生人应该多学习(科班出身的人熟不熟悉咱也不清楚)。遇到了这个问题值得专门开一篇。

一、Say Something — Author (SSA)

2021年2月24日郑州市政府办公厅印发关于“码农计划”的红头文件,计划力争用3年左右时间,储备10万名大数据人才。笔者的看法是:这个社会正在技术高速发展的路上驰骋。未来应该是高新技术和丰富艺术登上舞台C位的时候。未来还留有咱的位置那就多学习,不是家长们天天送去补习班的学习,是学感兴趣的(学不感兴趣的事物的行为扼杀了人类原始的学习动力,人出生就有却被应试教育抹干净的东西)。这个社会会给两种行为支付货币,创造价值的行为和提高创造价值效率的行为。


二、理论(Get To The Point言归正传)

1.概念

java动态代理:
  1. java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。
  2. 如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
  3. JDK动态代理只能对实现了接口的类生成代理,而不能针对类。
cglib(CODE GENERLIZE LIBRARY)动态代理:
  1. cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
  2. 如果目标对象实现了接口,可以强制使用CGLIB实现AOP 。
  3. CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法
    因为是继承,所以该类或方法最好不要声明成final 。

2.性能

比较:

JDK是基于反射机制,生成一个实现代理接口的匿名类,然后重写方法,实现方法的增强.
它生成类的速度很快,但是运行时因为是基于反射,调用后续的类操作会很慢.
而且他是只能针对接口编程的.。

CGLIB是基于继承机制,继承被代理类,所以方法不要声明为final,然后重写父类方法达到增强了类的作用.
它底层是基于asm第三方框架,是对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理.
生成类的速度慢,但是后续执行类的操作时候很快.
可以针对类和接口.

总结:

1. jdk是基于反射,CGLIB是基于字节码.所以性能上会有差异。
2. 在老版本CGLIB的速度是JDK速度的10倍左右,但是CGLIB启动类比JDK慢8倍左右,
3. 但是实际上JDK的速度在版本升级的时候每次都提高很多性能,而CGLIB仍止步不前。
4. 在对JDK动态代理与CGlib动态代理的代码实验中看,1W次执行下,
   JDK7及8的动态代理性能比CGlib要好20%左右

3.延申

反射概念

反射可以动态访问和调用类的方法和属性,而不局限于硬编码.提高了程序的扩展性,降低耦合度.允许程序创建可控制任何对象.

反射被广泛地用于那些需要在运行时检测或修改程序行为的程序中。这是一个相对高级
的特性,只有那些语言基础非常扎实的开发者才应该使用它。如果能把这句警示时刻放在心里,那么反射机制就会成为一项强大的技术,可以让应用程序做一些几乎不可能做到的事情。

缺点

尽管反射非常强大,但也不能滥用。如果一个功能可以不用反射完成,那么最好就不用.在我们使用反射技术时,下面几条内容应该牢记于心:

  • 性能第一 Performance Overhead

反射包括了一些动态类型,所以 JVM 无法对这些代码进行优化。因此,反射操作的效
率要比那些非反射操作低得多。我们应该避免在经常被 执行的代码或对性能要求很高的程序中使用反射

  • 内部暴露 Exposure of Internals

由于反射允许代码执行一些在正常情况下不被允许的操作(比如访问私有的属性和方
法),所以使用反射可能会导致意料之外的副作用--代码有功能上的错误,降低可移植性。反射代码破坏了抽象性,因此当平台发生改变的时候,代码的行为就有可能也随着变化。

  • 安全限制 Security Restrictions

使用反射技术要求程序必须在一个没有安全限制的环境中运行。如果一个程序必须在有
安全限制的环境中运行,如 Applet,那么这就是个问题了。


总结

spring框架中广泛应用了这两种代理来生成管理JavaBean。在非注解(xml中定义注入bean)类型的Aop中有。spring解析出合适的构造方法后也是通过类加载器reflect来获取类的代理对象。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值