码迷,mamicode.com
首页 > 其他好文 > 详细

CGLib动态代理和JDK动态代理

时间:2021-01-15 12:06:49      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:子类   代理   int   切面   动态代理   局限   内存   实现类   不能   

JDK就能实现动态代理,为什么还需要CGLib动态代理

  • CGLib动态代理不要求委托类实现接口,没有接口照样能实现代理业务
  • CGLib动态代理能够实现基于方法级别的拦截处理
  • CGLib动态代理执行方法,不是使用反射执行Method.invoke()

CGLib可以针对同一个委托类的不同方法可以使用不同的拦截逻辑来进行处理。结合调用链 还可以实现多重代理

  • JDK动态代理是创建接口的实现类代理对象,增强类的方法。
  • CGLib是创建当前类的子类代理对象,增强类的方法

在CGLib中,如果委托类被final修饰,那么它不能被继承,即不可以被代理;同样,如果委托类中存在final修饰的方法,那么该方法也不可以被代理。

面试题 CGLib动态代理原理是什么?

  • CGLib原理:动态生成一个要代理类的子类,子类重写要代理的类的所有不是final的方法。在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势植入横切逻辑,它比使用java反射的JDK动态代理要快。
  • CGLib底层:使用字节码处理框架ASM,来转换字节码并生成新的类。不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。
  • CGLib的缺点:无法对fianl类和方法进行代理。

JDK动态代理与CGLib代理的区别

  • JAVA动态代理是利用反射机制生成一个实现代理接口的类(这个类看不见,摸不着,在jvm内存中有这个类),在调用具体方法前调用InvokeHandler来处理。核心是实现InvokeHandler接口,使用invoke()方法进行面向切面的处理,调用相应的通知。
  • CGLib动态代理是利用ASM开源包,对代理对象类的class文件,通过修改其字节码生成子类来处理。核心是实现MethidInterceptor接口,使用intercept()方法进行面向切面的处理,调用相应的通知。
    1、如果目标对象实现了接口,默认情况下会Spring使用JDK的动态代理实现AOP
    2、如果目标对象实现了接口,也可以强制使用CGLib实现AOP
    3、如果目标对象没有实现接口,必须采用CGLib进行代理,Spring会自动在JDK动态代理和CGLib之间转换。

各自的局限性

1、JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能使用JDK动态代理。
2、CGLib的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为是采用继承,所有不能对final修饰的类进行代理。

CGLib动态代理和JDK动态代理

标签:子类   代理   int   切面   动态代理   局限   内存   实现类   不能   

原文地址:https://www.cnblogs.com/liuzhidao/p/14279459.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!