java中的动态代理机制
在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface)、另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的。下面通过代码来学习java中的动态代理技术.
首先定义一个接口:
package com.aop.spring; /** * Created by xinfengyao on 16-2-29. */ public interface Perform { public void play(); }
实现该接口:
package com.aop.spring; /** * Created by xinfengyao on 16-2-29. */ public class Actor implements Perform { @Override public void play() { System.out.println("开始表演"); } }
实现InvocationHandler:
package com.aop.spring; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * Created by xinfengyao on 16-2-29. */ public class MyHandler implements InvocationHandler { // 这个就是我们想要代理的真实对象 Perform performer; public MyHandler(Perform performer) { this.performer = performer; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 在代理的真实对象执行操作前, 我们可以执行自己的操作 System.out.println("表演开始之前,开灯"); // 真实对象执行操作 Object object = method.invoke(performer, args); //在真实对象执行完操作后, 我们也可以加上我们自己的操作 System.out.println("表演结束, 关灯"); return object; } }
创建代理,调用方法:
package com.aop.spring; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; /** * Created by xinfengyao on 16-2-29. */ public class ProxyDemo { public static void main(String[] args) { Perform performer = new Actor(); InvocationHandler handler = new MyHandler(performer); Perform proxy = (Perform) Proxy.newProxyInstance(performer.getClass().getClassLoader(), performer.getClass().getInterfaces(), handler); proxy.play(); } }
运行结果:
表演开始之前,开灯 开始表演 表演结束, 关灯
首先需要创建委托类对象,也就是我们想要代理的对象, 例如实例中的performer, 将其以构造函数传入代理处理器,代理处理器ProxyHandler中会以Java反射方式调用该委托类对应的方法。然后使用 Java反射机制中的Proxy.newProxyInstance方式创建一个代理类实例,创建该实例需要指定该实例的类加载器,需要实现的接口(即目 标接口),以及处理代理实例接口调用的处理器。
最后,调用代理类目标接口方法时,会自动将其转发到代理处理器中的invoke方法内,invoke方法内部实现预处理,对委托类方法调用,事后处理等逻辑。