在Java编程中,代理模式是一种设计模式,它允许我们在不修改原有对象的基础上,为对象添加新的功能或行为。代理模式通常用于控制访问、增加额外的处理逻辑或提供一种替代的接口。Java提供了两种主要的代理实现方式:CGLIB代理和JDK动态代理。 **JDK动态代理**: JDK动态代理主要依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。Proxy类用于创建一个代理对象,而InvocationHandler接口定义了调用处理程序的接口,代理对象的方法调用会转发到这个处理程序。创建JDK动态代理的基本步骤如下: 1. 实现InvocationHandler接口,重写invoke()方法,该方法会在代理对象的方法被调用时执行。 2. 使用Proxy.newProxyInstance()静态方法,传入目标对象的类加载器、目标对象所实现的接口列表以及刚才创建的InvocationHandler实例,生成代理对象。 3. 通过代理对象调用方法,实际调用会转到之前定义的InvocationHandler的invoke()方法。 示例代码: ```java interface MyInterface { void doSomething(); } class Target implements MyInterface { @Override public void doSomething() { System.out.println("Target 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 action"); method.invoke(target, args); System.out.println("After action"); return null; } } public class Main { public static void main(String[] args) { MyInterface target = new Target(); MyInterface proxy = (MyInterface) Proxy.newProxyInstance( Target.class.getClassLoader(), new Class[]{MyInterface.class}, new MyInvocationHandler(target) ); proxy.doSomething(); } } ``` **CGLIB代理**: CGLIB(Code Generation Library)是一个强大的高性能的代码生成库,它可以在运行期扩展Java类与实现Java接口。CGLIB是通过创建目标类的子类来实现代理的,因此对于没有接口的类,CGLIB是更好的选择。CGLIB的核心是`net.sf.cglib.proxy.Enhancer`类和`MethodInterceptor`接口。 1. 创建Enhancer实例,并设置回调对象,通常是实现了MethodInterceptor接口的类。 2. 调用enhance().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; public class CglibProxy implements MethodInterceptor { public Object getInstance(Target target) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(Target.class); enhancer.setCallback(this); return enhancer.create(); } @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("Before action"); Object result = proxy.invokeSuper(obj, args); System.out.println("After action"); return result; } public static void main(String[] args) { CglibProxy proxy = new CglibProxy(); Target target = (Target) proxy.getInstance(new Target()); target.doSomething(); } } class Target { public void doSomething() { System.out.println("Target doing something"); } } ``` JDK动态代理适用于目标对象实现了接口的情况,而CGLIB则适用于无接口或接口较少的情况。两者都可以在运行时为对象添加额外的功能,提升代码的灵活性。在实际开发中,应根据具体需求选择合适的代理方式。
- 1
- 粉丝: 161
- 资源: 6
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助