动态代理工厂
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyFactory {
//目标对象 被代理对象
private Object target;
//前置增强
private BeforeAdvice beforeAdvice;
//后置增强
private AfterAdvice afterAdvice;
public ProxyFactory() {
}
public ProxyFactory(Object target) {
this.target = target;
}
public Object getTarget() {
return target;
}
public void setTarget(Object target) {
this.target = target;
}
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 Object createProxy() {
Object proxy = Proxy.newProxyInstance(
ProxyFactory.class.getClassLoader(),
//反射得到代理对象实例
target.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//对需要代理的对象前置增强
if (beforeAdvice != null) beforeAdvice.beforeAdvice();
//执行原需要增强的代理对象代码
method.invoke(target,args);
//对需要代理的对象后置增强
if (afterAdvice != null) afterAdvice.afterAdvice();
return null;
}
});
return proxy;
}
}
前置增强接口
public interface AfterAdvice {
void afterAdvice();
}
后置增强接口
public interface BeforeAdvice {
void beforeAdvice();
}
实现前置或者后置增强接口就可以对代理对象进行增强。整个动态代理过程中完全不需要更改原代码,就可以在原代码基础上前后增加其他的功能。