动态代理的例子
结构如下 :
图片1
Java代码
package com.client;import com.intercept.Interceptor;import com.intercept.MyProxy;import com.target.Target;import com.target.TargetInterface;/** * 程序入口, 有main方法 * */public class Client{ public static void main(final String[] args) { //目标对象,将被代理 final TargetInterface target = new Target(); //设置插入的对象,对象的"三个方法"将被插入到"目标对象"的方法前面,后面,异常时 final Interceptor in = new Interceptor(); //代理 final MyProxy myProxy = new MyProxy(); //目标类实现的接口 final TargetInterface proxy = (TargetInterface) myProxy.getProxy(target, in); //代理对象(代理了目标对象 Target) proxy.doSomething(); proxy.string(); }}
Java代码
package com.intercept;/** * 被插入的接口, * */public interface InterceptorInterface{ /** * 在目标方法 前执行 */ public void before(); /** * 在目标方法 后执行 */ public void after(); /** * 在目标方法 异常时执行 */ public void error();}
Java代码
package com.intercept;/** * 被插入的方法, 普通方法 * */public class Interceptor implements InterceptorInterface{ @Override public void error() { System.out.println("异常了"); } public void before() { System.out.println("前面插入的方法"); } public void after() { System.out.println("后面插入的方法"); }}
Java代码
package com.target;/** * TargetInterface接口 ,Target是本接口的实现类 * */public interface TargetInterface{ void doSomething(); void string();}
Java代码
package com.target;/** * 目标类, 本类被代理 , 实现了TargetInterface接口 * */public class Target implements TargetInterface{ @Override public void doSomething() { System.out.println("----作个体工作!---"); } public void string() { System.out.println("string()被执行"); }}
Java代码
package com.intercept;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;/** * 结合 把目标对象, 与包含要插入的方法的对象 结合起来 * */public class MyHandler implements InvocationHandler{ private InterceptorInterface interception; private Object object; /** * 目标对象,将被代理 */ public void setObject(final Object object) { this.object = object; } /** * 本接口的"实现类"的"三个方法"将被插入到"目标对象"的方法前面,后面,异常时 */ public void setInterception(final InterceptorInterface interception) { this.interception = interception; } /** * 结合 */ @Override public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable { Object result = null; //先插入一个方法 interception.before(); try { //执行目标方法 result = method.invoke(object, args); } finally { interception.error(); } //后插入一个方法 interception.after(); return result; }}
Java代码
package com.intercept;
import java.lang.reflect.Proxy;
/**
* 代理类, 核心
*
*/
public class MyProxy
{
public Object getProxy(final Object object, final InterceptorInterface in)
{
final MyHandler myHandler = new MyHandler();
//设置目标对象
myHandler.setObject(object);
//设置插入的对象,对象的"三个方法"将被插入到"目标对象"的方法前面,后面,异常时
myHandler.setInterception(in);
//返回代理对象
return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), myHandler);
}
}