Waiter:
package com.mango.demo3;
public interface Waiter {
public void serve();
}
Manwaiter:
package com.mango.demo3;
public class ManWaiter implements Waiter {
public void serve() {
System.out.println("服务中...");
}
}
BeforeAdvice:
package com.mango.demo3;
public interface BeforeAdvice {
public void before();
}
AfterAdvice:
package com.mango.demo3;
public interface AfterAdvice {
public void after();
}
ProxyFactory:
package com.mango.demo3;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyFactory {
private Object targetObject;//目标对象
private BeforeAdvice beforeAdvice;//前置增强
private AfterAdvice afterAdvice;//后置增强
public Object createProxy() {
InvocationHandler h = new InvocationHandler() {
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 result = Proxy.newProxyInstance(this.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), h);
return result;
}
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;
}
}
Demo3:
package com.mango.demo3;
import org.junit.Test;
public class Demo3 {
@Test
public void fun1() {
ProxyFactory factory = new ProxyFactory();
factory.setTargetObject(new ManWaiter());
factory.setBeforeAdvice(new BeforeAdvice() {
public void before() {
System.out.println("你好");
}
});
factory.setAfterAdvice(new AfterAdvice() {
public void after() {
System.out.println("Bay!");
}
});
Waiter waiter = (Waiter) factory.createProxy();
waiter.serve();
}
}
执行结果:
你好
服务中...
Bay!