JAVA动态代理
Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建具有特定接口的代理类对象,从而在不修改原有代码的基础上扩展或增强其功能。动态代理主要涉及到两个关键类:`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`。 ### JDK动态代理(JDKProxy) JDK动态代理基于接口实现,它要求代理的目标对象必须实现至少一个接口。以下是对JDK动态代理的详细说明: 1. **Proxy类**:Proxy类是JDK提供的用于创建动态代理类的工具类。通过调用`Proxy.newProxyInstance()`方法,我们可以生成一个实现了特定接口的代理对象。 2. **InvocationHandler接口**:这个接口定义了代理对象的方法调用行为。当代理对象的方法被调用时,实际执行的是`InvocationHandler.invoke()`方法。我们可以通过实现这个接口,自定义方法调用的处理逻辑。 3. **示例**:创建一个代理对象,首先需要实现InvocationHandler接口,然后通过Proxy.newProxyInstance()生成代理实例。代理对象在调用方法时会回调我们自定义的InvocationHandler。 ```java interface MyInterface { void doSomething(); } class MyTarget implements MyInterface { public void doSomething() { System.out.println("Doing something..."); } } class MyInvocationHandler implements InvocationHandler { private Object target; public MyInvocationHandler(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("Before method call..."); Object result = method.invoke(target, args); System.out.println("After method call..."); return result; } } public class Main { public static void main(String[] args) { MyInterface target = new MyTarget(); MyInterface proxy = (MyInterface) Proxy.newProxyInstance( MyInterface.class.getClassLoader(), new Class[]{MyInterface.class}, new MyInvocationHandler(target) ); proxy.doSomething(); // 会打印出Before和After } } ``` ### CGLib动态代理(CGLibProxy) CGLib(Code Generation Library)是另一个常用的动态代理库,它通过字节码技术生成目标对象的子类来实现代理。与JDK动态代理相比,CGLib不需要目标对象实现任何接口,可以对类进行代理,因此它的应用更为广泛。 1. **CGLib Enhancer**:CGLib的核心类Enhancer,用于生成代理对象。通过设置拦截器(Callback),我们可以控制代理对象的行为。 2. **MethodInterceptor接口**:CGLib的拦截器接口,它的`intercept()`方法在目标方法调用前后执行。类似InvocationHandler,但它是针对类而非接口。 3. **示例**:使用CGLib创建代理对象,需要先创建一个实现了MethodInterceptor的类,然后通过Enhancer.create()生成代理实例。 ```java import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; class MyTarget { public void doSomething() { System.out.println("Doing something..."); } } class MyInterceptor implements MethodInterceptor { @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("Before method call..."); Object result = proxy.invokeSuper(obj, args); System.out.println("After method call..."); return result; } } public class Main { public static void main(String[] args) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(MyTarget.class); enhancer.setCallback(new MyInterceptor()); MyTarget proxy = (MyTarget) enhancer.create(); proxy.doSomething(); // 会打印出Before和After } } ``` 总结来说,JDK动态代理适用于目标对象实现有接口的情况,而CGLib则更适合没有接口或者接口数量过多的情况。两者都能实现面向切面编程(AOP),提供方法调用前后的拦截逻辑,但在具体使用时应根据项目需求和性能要求选择合适的动态代理方式。在CGLib&JDK_Proxy压缩包中,可能包含了关于这两种动态代理技术的示例代码,供学习和参考。
- 1
- 粉丝: 29
- 资源: 13
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Java 多线程课程的代码及少量注释.zip
- 数据库课程设计-基于的个性化购物平台的建表语句.sql
- 数据库课程设计-基于的图书智能一体化管理系统的建表语句.sql
- Java 代码覆盖率库.zip
- Java 代码和算法的存储库 也为该存储库加注星标 .zip
- 免安装Windows10/Windows11系统截图工具,无需安装第三方截图工具 双击直接使用截图即可 是一款免费可靠的截图小工具哦~
- Libero Soc v11.9的安装以及证书的获取(2021新版).zip
- BouncyCastle.Cryptography.dll
- 5.1 孤立奇点(JD).ppt
- 基于51单片机的智能交通灯控制系统的设计与实现源码+报告(高分项目)