11 动态代理的例子

结构如下 :

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();

	}
}
package com.intercept;

/**
 * 被插入的接口,
 * 
 */
public interface InterceptorInterface
{
	/**
	 * 在目标方法 前执行
	 */
	public void before();

	/**
	 * 在目标方法 后执行
	 */
	public void after();

	/**
	 * 在目标方法 异常时执行
	 */
	public void error();

}
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("后面插入的方法");
	}
}
package com.target;

/**
 * TargetInterface接口 ,Target是本接口的实现类
 * 
 */
public interface TargetInterface
{
	void doSomething();

	void string();

}
package com.target;

/**
 * 目标类, 本类被代理 , 实现了TargetInterface接口
 * 
 */
public class Target implements TargetInterface
{

	@Override
	public void doSomething()
	{
		System.out.println("----作个体工作!---");

	}

	public void string()
	{
		System.out.println("string()被执行");
	}
}
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;
	}

}
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);
	}
}

附件中有eclipse 的java工程源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值