JDK动态代理和CGLIB


程序员的公众号:源1024获取更多资料,无加密无套路!

最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》,《Java并发编程实战》等等
获取方式: 关注公众号并回复 电子书 领取,更多内容持续奉上


JDK动态代理和CGLIB是Java中常用的两种代理技术

  • JDK动态代理

    基于Java反射机制实现的,要求目标类必须实现一个或多个接口。它使用java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来生成代理类和处理代理方法的调用。在运行时,JDK动态代理会动态生成一个代理类,该代理类实现了目标接口,并在方法调用前后插入额外的代码。然而,JDK动态代理只能代理接口,无法代理普通的类。

    使用条件

    1、业务目标对象实现接口

    2、实现InvocationHandler接口

    3、使用Proxy.newProxyInstance()方法生成代理对象

   适用场景:事务处理、日志记录

  • CGLIB

    基于ASM字节码框架实现的,可以代理普通的类,不需要目标类实现接口。它使用字节码生成库,在运行时通过生成目标类的子类来实现代理。CGLIB通过继承目标类创建一个子类,并重写目标方法,在方法调用前后插入代理逻辑。由于继承关系,CGLIB无法代理被标记为final的类或方法。

    使用条件:需要引用cglib库和asm库

       适用场景:Spring中的AOP切面编程

总结

如果目标类已经实现了接口且需要基于接口进行代理,则选择JDK动态代理。​如果目标类没有实现接口,或者需要代理普通类的方法,可以选择CGLIB。

你可能感兴趣的:(java,java)