interview
java-basics
JDK动态代理和CGLIB动态代理有什么区别?

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

相关问题

🦆
什么是反射?反射的用途是什么?

反射是 Java 提供的一种机制,允许程序在运行时获取类的内部信息(如方法、字段等)并进行操作。通过反射,程序可以动态地创建对象、调用方法或访问字段。反射常用于框架设计中,例如 Spring、Hibernate 等,以实现高层次的动态功能,比如依赖注入、动态代理等。

🦆
AOP面向切面编程是什么?

AOP 是一种编程范式,旨在将横切关注点(如日志、事务管理、安全性等)与业务逻辑分离。通过 AOP,可以在不改变业务逻辑的情况下,将这些关注点的逻辑代码分离出来,增强代码的可维护性和重用性。AOP 的实现通常依赖于动态代理。

🦆
什么是 ASM?ASM 和 CGLIB 的关系是什么?

ASM 是一个 Java 字节码操纵框架,允许开发者直接生成或修改字节码。CGLIB 使用 ASM 生成动态代理类。ASM 提供了底层的字节码操作功能,而 CGLIB 则基于 ASM 封装了生成代理类的逻辑,使得开发者可以更方便地生成动态代理。