Java 基础面试题, JDK 动态代理和 CGLIB 动态代理有什么区别?
Java 基础面试题, JDK 动态代理和 CGLIB 动态代理有什么区别?
QA
Step 1
Q:: JDK 动态代理和 CGLIB 动态代理有什么区别?
A:: JDK 动态代理与 CGLIB 动态代理的主要区别在于:1. 实现方式:JDK 动态代理是基于接口的代理,通过反射机制生成代理类,只能代理实现了接口的类;而 CGLIB 动态代理是通过生成目标类的子类来实现代理,因此可以代理没有实现接口的类。2. 性能:由于 CGLIB 生成的代理类是直接继承目标类,因此在调用非接口方法时性能略高于 JDK 动态代理。然而,由于 CGLIB 需要在运行时生成字节码,且生成的子类在内存中占用更多空间,启动速度比 JDK 动态代理稍慢。3.
适用场景:JDK 动态代理适用于需要代理接口的场景,而 CGLIB 动态代理适用于代理没有接口的类的场景。
Step 2
Q:: 什么是动态代理?
A:: 动态代理是一种在运行时生成代理类的机制,而不是在编译时确定代理类。通过动态代理,代理类可以拦截对目标对象方法的调用,在调用前后添加额外的逻辑或修改调用行为。动态代理通常用于实现横切关注点,例如日志记录、事务管理、权限检查等。
Step 3
Q:: 什么是 JDK 动态代理?
A:: JDK 动态代理是 Java 提供的一种动态代理实现方式,基于 Java 反射机制,通过实现 InvocationHandler
接口并使用 Proxy
类的静态方法生成代理对象。JDK 动态代理只能代理实现了接口的类,通过代理对象来拦截方法调用,执行额外的操作。
Step 4
Q:: 什么是 CGLIB 动态代理?
A:: CGLIB (Code Generation Library)
是一个强大的高性能代码生成库,它可以在运行时动态生成目标类的子类,以此来代理目标类的所有方法。与 JDK 动态代理不同,CGLIB 动态代理不需要目标类实现任何接口,因此可以代理普通类。CGLIB 通过使用 ASM 字节码生成框架直接生成二进制字节码,使得代理类的执行性能较高。