/**
* 前置增强
* @author Administrator
*
*/
public interface BeforeAdvice {
public void before();
}
/**
* 后置增强
* @author Administrator
*
*/
public interface AfterAdvice {
public void after();
}
public interface Waiter {
public void serve();
public void shouQian();
}
public class ManWaiter implements Waiter {
public void serve() {
System.out.println("服务中");
}
@Override
public void shouQian() {
System.out.println("给钱");
}
}
/**
* 用来生成代理对象
* 需要所有的参数
* 目标对象
* 增强
*/
/**
* 1、创建代理工厂
* 2、给工厂设置三样东西
* 目标对象:setTargetObject(xxx);
* 前置增强:setBeforeAdvice(该接口的实现)
* 后置增强: setAfterAdvice(该接口的实现)
* 3、调用createProxy()得到代理对象
* 执行代理对象方法时,
* 执行BeforeAdvice的before()
* 目标对象的目标方法
* 执行AfterAdvice的after()
* @author Administrator
*
*/
public class ProxyFactory {
private Object targetObject;
private BeforeAdvice beforeAdvice;
private AfterAdvice afterAdvice;
/**
* 用来生成代理对象
* @return
*/
public Object createProxy(){
ClassLoader loader = this.getClass().getClassLoader();
Class[] interfaces = targetObject.getClass().getInterfaces();
InvocationHandler h = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if(beforeAdvice!=null){
beforeAdvice.before();
}
Object result = method.invoke(targetObject, args);
if(afterAdvice!=null){
afterAdvice.after();
}
return result;
}
};
Object proxyObject = Proxy.newProxyInstance(loader, interfaces, h);
return proxyObject;
}
public Object getTargetObject() {
return targetObject;
}
public void setTargetObject(Object targetObject) {
this.targetObject = targetObject;
}
public BeforeAdvice getBeforeAdvice() {
return beforeAdvice;
}
public void setBeforeAdvice(BeforeAdvice beforeAdvice) {
this.beforeAdvice = beforeAdvice;
}
public AfterAdvice getAfterAdvice() {
return afterAdvice;
}
public void setAfterAdvice(AfterAdvice afterAdvice) {
this.afterAdvice = afterAdvice;
}
}
public class Demo3 {
@Test
public void fun1(){
ProxyFactory factory = new ProxyFactory();
factory.setTargetObject(new ManWaiter());
factory.setBeforeAdvice(new BeforeAdvice() {
@Override
public void before() {
System.out.println("如果啊");
}
});
factory.setAfterAdvice(new AfterAdvice() {
public void after() {
System.out.println("告辞");
}
});
Waiter waiter = (Waiter) factory.createProxy();
waiter.serve();
waiter.shouQian();
}
}