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

  • 相关阅读:
    mysql数据库基本类型
    常用辅助类【转】
    Java 并发笔记】并发机制底层实现整理[转发]
    关于PROPAGATION_NESTED的理解
    线程数设置
    c# Expression 扩展[转]
    Net定时器 【转载】
    【转】高可用设计-58沈剑
    【转】委托的三种调用示例(同步调用 异步调用 异步回调)
    [coursera OA] acme match
  • 原文地址:https://www.cnblogs.com/sunny-miss/p/12417069.html
Copyright © 2011-2022 走看看