动态代理是一种在运行时创建代理对象的技术,无需在编译期静态地创建代理类。代理对象可以实现代理模式,为一个或一组接口提供代理实现,这个代理对象可以在方法调用前后添加额外的处理逻辑,比如权限验证、日志记录、事务管理等。
在Java中,动态代理有两种实现方式:
-
Java内置的动态代理(Java Proxy):
- Java标准库中提供了
java.lang.reflect.Proxy
类和java.lang.reflect.InvocationHandler
接口来实现动态代理。InvocationHandler接口包含一个invoke方法,当通过代理对象调用方法时,这个方法会被调用,从而在方法调用前后添加额外的处理逻辑。
1// 创建一个InvocationHandler实现类 2InvocationHandler handler = new MyInvocationHandler(targetObject); 3// 动态生成并返回代理对象 4MyInterface proxy = (MyInterface) Proxy.newProxyInstance( 5 MyInterface.class.getClassLoader(), 6 new Class<?>[]{MyInterface.class}, 7 handler 8);
- Java标准库中提供了
-
CGLIB库:
- CGLIB(Code Generation Library)是一个第三方库,它通过字节码操作技术在运行时生成一个目标类的子类作为代理类,实现方法拦截。相比于Java内置的动态代理,CGLIB可以代理非接口的类。
无论是Java内置的动态代理还是CGLIB,其本质都是在运行时生成一个新的类,这个类能够代理原始对象的方法调用,从而在不修改原有业务代码的基础上,实现对业务方法的增强或控制。这种技术在面向切面编程(AOP)中有着广泛应用。