当前位置: 首页 > 知识库问答 >
问题:

JDK动态代理和CGLIB有什么区别?

谭景福
2023-03-14

在代理设计模式的情况下,jdk的动态代理和第三方的动态代码生成API(如cglib)有什么区别?

使用这两种方法之间有什么区别?什么时候应该选择一种方法而不是另一种方法

共有2个答案

陆宾白
2023-03-14

功能差异

>

  • JDK代理允许在子类化object时实现任何一组接口。然后,任何接口方法,加上Object::HashCodeObject::EqualsObject::ToString都会转发给InvocationHandler。此外,还实现了标准库接口java.lang.reflect.proxy

    cglib允许您在子类化任何非final类的同时实现任何一组接口。而且,方法可以被可选地重写,即不是所有的非抽象方法都需要被截取。此外,有不同的实现方法。它还提供了一个InvocationHandler类(在另一个包中),但它也允许通过使用更高级的拦截器来调用超级方法,例如MethodInterceptor。此外,cglib还可以通过诸如fixedvalue这样的专门拦截来提高性能。我曾经为cglib写过一篇不同拦截器的摘要。

    性能差异

    JDK代理的实现相当幼稚,只有一个拦截分派程序InvocationHandler。这需要将虚拟方法分派到不能总是内联的实现。Cglib允许创建专用字节码,有时可以提高性能。下面是用18个存根方法实现一个接口的一些比较:

                cglib                   JDK proxy
    creation    804.000     (1.899)     973.650     (1.624)
    invocation    0.002     (0.000)       0.005     (0.000)
    

    时间以纳秒为单位,标准差用大括号表示。您可以在Byte Buddy的教程中找到关于基准测试的更多细节,其中Byte Buddy是CGLIB的更现代的替代方案。另外,请注意,cglib不再处于积极开发中。

  • 松涵容
    2023-03-14

    JDK动态代理只能按接口代理(因此您的目标类需要实现一个接口,然后也由代理类实现)。

    CGLIB(和javassist)可以通过子类创建代理。在此场景中,代理成为目标类的子类。不需要接口。

    因此Java动态代理可以代理:public class Foo实现Ifoo而CGLIB可以代理:public class Foo

    编辑:

    我应该提到,因为javassist和CGLIB通过子类化使用代理,所以在使用依赖于此的框架时,您不能声明final方法或使类final化。这将阻止这些库允许子类您的类和重写您的方法。

     类似资料:
    • 问题内容: 如果是代理设计模式,那么JDK的动态代理和第三方动态代码生成API(例如CGLib)有什么区别? 使用这两种方法之间的区别是什么?何时应该优先选择另一种方法? 问题答案: JDK动态代理只能按接口进行代理(因此,您的目标类需要实现一个接口,然后该接口也可以由代理类实现)。 CGLIB(和javassist)可以通过子类化创建代理。在这种情况下,代理将成为目标类的子类。无需接口。 因此,

    • 本文向大家介绍Spring中JDK动态代理和CGLib代理之间的区别,包括了Spring中JDK动态代理和CGLib代理之间的区别的使用技巧和注意事项,需要的朋友参考一下 Spring AOP是基于代理的。Spring使用了两种代理策略,一种是JDK动态代理,另一种是CGLIB代理。 JDK提供了JDK动态代理。它只能是按接口的代理,因此目标类需要实现接口。在您实现一个或多个接口时,spring会

    • 本文向大家介绍Java反射和动态代理的区别(JDK Proxy和Cglib)相关面试题,主要包含被问及Java反射和动态代理的区别(JDK Proxy和Cglib)时的应答技巧和注意事项,需要的朋友参考一下 反射和动态代理放有一定的相关性,但单纯的说动态代理是由反射机制实现的,其实是不够全面不准确的,动态代理是一种功能行为,而它的实现方法有很多。要怎么理解以上这句话,请看下文。 反射机制是 Jav

    • 本文向大家介绍spring cglib 与 jdk 动态代理,包括了spring cglib 与 jdk 动态代理的使用技巧和注意事项,需要的朋友参考一下 1. 概述 JDK动态代理是利用java反射机制 生成一个实现接口的匿名类, 在调用具体方法前调用InvocationHandler来处理 Cglib动态代理是 利用asm开源包 把被代理类的class文件加载进来 通过修改其字节码生成子类来处

    • 本文向大家介绍浅谈Java代理(jdk静态代理、动态代理和cglib动态代理),包括了浅谈Java代理(jdk静态代理、动态代理和cglib动态代理)的使用技巧和注意事项,需要的朋友参考一下 一、代理是Java常用的设计模式,代理类通过调用被代理类的相关方法,并对相关方法进行增强。加入一些非业务性代码,比如事务、日志、报警发邮件等操作。 二、jdk静态代理 1、业务接口 2、业务实现类 3、代理类

    • 我的问题与“代理内部的自我调用问题”有关,但不是我的问题。(我已经找到了该问题的一些解决方案,例如这里所描述的)。我还找到了为什么会发生这种情况的基本解释,这里 1)根据我现在对代码外观的描述,您会怎么做来避免从上下文中获取bean?我不想将每个服务分成两个类,以避免自调用问题。我想要一种方法来使aspectJ和预授权工作如所描述的那样。2)我不明白为什么CGLIB以它的方式实现代理。所以假设我有