在代理设计模式的情况下,jdk的动态代理和第三方的动态代码生成API(如cglib)有什么区别?
使用这两种方法之间有什么区别?什么时候应该选择一种方法而不是另一种方法?
功能差异
>
JDK代理允许在子类化object
时实现任何一组接口。然后,任何接口方法,加上Object::HashCode
、Object::Equals
和Object::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不再处于积极开发中。
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以它的方式实现代理。所以假设我有