Java基础面试题, JDK 动态代理和 CGLIB 动态代理有什么区别?
Java基础面试题, JDK 动态代理和 CGLIB 动态代理有什么区别?
QA
Step 1
Q:: JDK 动态代理和 CGLIB 动态代理有什么区别?
A:: JDK 动态代理和 CGLIB 动态代理都是 Java 中实现代理模式的两种主要方式。JDK 动态代理基于 Java 的反射机制,只能代理实现了接口的类,而 CGLIB 动态代理则是通过字节码生成的方式,可以代理未实现接口的类。JDK 动态代理在性能上稍逊于 CGLIB,尤其是当需要代理大量方法时,CGLIB 的性能优势更加明显。此外,CGLIB 动态代理不能代理 final 类,因为它需要生成子类来实现代理。
Step 2
Q:: JDK 动态代理的实现原理是什么?
A:: JDK 动态代理是基于反射机制实现的。通过 java.lang.reflect.Proxy
类和 InvocationHandler
接口实现。代理类通过调用 Proxy.newProxyInstance()
方法生成,InvocationHandler
中的 invoke
方法负责处理代理类的方法调用。在实际执行时,代理类会将所有的方法调用委托给 InvocationHandler
进行处理。
Step 3
Q:: CGLIB 动态代理的实现原理是什么?
A:: CGLIB 动态代理是通过生成目标类的子类并在子类中拦截方法调用来实现的。CGLIB 使用 ASM 字节码操纵框架动态生成字节码,并在运行时创建新的类。CGLIB 通过继承目标类,并在子类中对方法进行增强,因此不能代理 final 类,因为 final 类无法被继承。
用途
动态代理在实际生产环境中广泛应用于 AOP(面向切面编程)场景,比如事务管理、日志记录、安全控制等。在这些场景中,通过动态代理可以在不修改目标方法源码的前提下,为目标方法添加额外的功能。JDK 动态代理适用于代理实现了接口的类,而 CGLIB 动态代理适用于没有接口的类。在性能要求较高的场景下,CGLIB 由于直接操作字节码,通常会有更好的表现。\n相关问题
🦆
什么是反射?反射的用途是什么?▷
🦆
AOP面向切面编程是什么?▷
🦆
什么是 ASM?ASM 和 CGLIB 的关系是什么?▷