• 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

  • 相关阅读:
    第3章 对象基础
    [置顶] CSDN博客客户端(非官方)
    javascript 修改对象
    Print2Flash出现"System Error. Code:1722. RPC服务器不可用."错误解决办法
    ConfigHelper 配置文件辅助类
    多个委托方法的顺序执行
    javascript Table
    字符串拼接方式(待商榷)
    CSDN博客客户端(非官方)
    javascript 对象继承
  • 原文地址:https://www.cnblogs.com/sunny-miss/p/12417069.html
Copyright © 2020-2023  润新知