动态代理的例子

来源:岁月联盟 编辑:zhuzhu 时间:2009-03-20

  

  结构如下 :


图片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);   

    }   

}