Java.lang.reflect包下,提供了实现代理机制的接口和类:
-
public interface InvocationHandler
InvocationHandler
是代理实例的调用处理程序 实现的接口。 -
public class Proxy extends Object implements Serializable
Proxy
提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。
Java的动态代理依赖于接口,虽然在生成效率上较高,但是执行效率比较慢,而且Java的反射机制本身消耗的资源就比一般的调用来得更大一点。
Spring中给予客户端自主选择是使用Java的动态代理还是使用CGLIB第三方代理实现,两者各有特点。
简单地说,Java的代理机制实现如下:
- 创建业务对象;
- 创建处理程序;
- 创建代理类;
示例:
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; /** * Created by lay on 21/02/2018. */ public class ProxyDemo { public static void main(String[] args) { // 创建 被代理对象 FooService fooService = new FooServiceImpl(); // 实现 被代理对象 的处理程序 InvocationHandler handler = new MyInvocationHandler(fooService); // 返回 代理对象 FooService fooServiceProxy = (FooService) Proxy.newProxyInstance(fooService.getClass().getClassLoader(), fooService.getClass().getInterfaces(), handler); // 代理对象调用方法 fooServiceProxy.getData(); } }
/** * 定义用户接口 * Created by lay on 21/02/2018. */ public interface FooService { void getData(); }
/** * 实现用户接口 * Created by lay on 21/02/2018. */ public class FooServiceImpl implements FooService { @Override public void getData() { System.out.println("调用了FooService实现类方法---getData..."); } }
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * 实现JDK动态代理接口 * Created by lay on 21/02/2018. */ public 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("执行前..."); Object result = method.invoke(target,args); System.out.println("执行后..."); return result; } }
原文地址:https://www.cnblogs.com/lay2017/p/8457008.html
时间: 2024-10-16 11:08:34