Java基础面试题, 什么是 Java 中的动态代理?
Java基础面试题, 什么是 Java 中的动态代理?
QA
Step 1
Q:: 什么是Java中的动态代理?
A:: Java中的动态代理是指在程序运行时生成代理类,而不是在编译时生成的代理类。动态代理允许我们为接口动态创建代理实例,从而在方法调用时进行一些额外的操作,例如日志记录、权限检查、事务管理等。Java中的动态代理主要有两种方式:JDK动态代理和CGLIB代理。JDK动态代理只支持基于接口的代理,而CGLIB代理则支持基于类的代理。
Step 2
Q:: JDK动态代理的实现原理是什么?
A:: JDK动态代理依赖于Java反射机制来创建代理实例。它使用了java.lang.reflect.
Proxy类和InvocationHandler接口。Proxy类可以创建代理对象,而InvocationHandler接口用于定义代理对象在方法调用时应执行的操作。当代理对象调用某个方法时,实际会由InvocationHandler的invoke方法处理,这样我们可以在invoke方法中添加自定义的逻辑,例如权限检查、日志记录等。
Step 3
Q:: CGLIB动态代理的实现原理是什么?
A:: CGLIB(Code Generation Library)动态代理通过生成目标类的子类并重写其中的方法来实现代理。它使用ASM字节码操作框架在运行时动态生成代理类。与JDK动态代理不同,CGLIB可以为没有实现接口的类生成代理。CGLIB代理的核心类是Enhancer类,通过该类可以创建目标类的代理实例,并通过MethodInterceptor接口来定义方法调用时的行为。
Step 4
Q:: 动态代理在实际开发中的应用场景有哪些?
A:: 动态代理在实际开发中有广泛的应用场景,包括AOP(面向切面编程)、拦截器、事务管理、权限控制和日志记录等。例如,在Spring框架中,动态代理被广泛用于实现AOP,通过在方法执行前后添加额外的逻辑来实现业务需求。动态代理还可以用来实现远程服务调用的客户端代理,例如通过代理对象封装远程服务的调用细节,使客户端只需调用本地接口即可。
Step 5
Q:: Java中的静态代理和动态代理有什么区别?
A:: 静态代理是在程序编译时就已经确定代理类,而动态代理是在运行时生成代理类。静态代理需要为每个接口单独编写代理类,增加了代码的维护成本,而动态代理可以通过反射机制在运行时动态生成代理类,极大地减少了代码冗余。动态代理更为灵活,因为它允许在运行时对代理的行为进行动态调整,而静态代理在编译后则无法更改。