结构如下 :
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工程源码