zoukankan      html  css  js  c++  java
  • jdk动态代理和cglib动态代理的区别

    CGLIB代理:

    CGLIB底层:使用字节码处理框架ASM,来转换字节码并生成新的类。 

    CGLIB(CODE GENERLIZE LIBRARY)代理是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的所有方法,所以该类或方法不能声明称final的。

    如果目标对象实现了接口,可以强制使用CGLIB实现代理。

    如果目标对象没有实现接口,则默认会采用CGLIB代理; 

    为什么jdk动态代理必须基于接口 
    原因如下: 
    1、生成的代理类继承了Proxy,由于java是单继承,所以只能实现接口,通过接口实现 

    2、从代理模式的设计来说,充分利用了java的多态特性,也符合基于接口编码的规范 

    为什么需要接口,先上结论

    1.在需要继承proxy类获得有关方法和InvocationHandler构造方法传参的同时,java不能同时继承两个类,我们需要和想要代理的类建立联系,只能实现一个接口

    2.需要反射获得代理类的有关参数,必须要通过某个类,反射获取有关方法,如本次测试用的 :printSomeThing

    3.成功返回的是object类型,要获取原类,只能继承/实现,或者就是那个代理类

    4.对具体实现的方法内部并不关心,这个交给InvocationHandler.invoke那个方法里去处理就好了,我只想根据你给我的接口反射出对我有用的东西。

    5.考虑到设计模式,以及proxy编者编写代码的逻辑使然

    jdk代理和cglib代理的区别:(https://blog.csdn.net/yhl_jxy/article/details/80635012

  • 相关阅读:
    Oracle EXTRACT()函数与to_char() 函数
    Java内部类
    SQL 之 Group By
    Android LayoutInflater布局填充器
    JS 图片转Base64
    C# 事件与委托的区别
    AngularJS的循环输出
    jquery实现button倒计时
    重新理解B/S和C/S的区别
    HashMap与HashTable
  • 原文地址:https://www.cnblogs.com/sunny-miss/p/12417069.html
Copyright © 2011-2022 走看看