Java静态代理
public interface BaseAction {
void doSomething();
void doSomething2(); }
public class PrintAction implements BaseAction {
@Override
public void doSomething() {
System.out.println("打印");
}
@Override
public void doSomething2() {
System.out.println("打印2");
}}
public class StaticProxy implements BaseAction {
private BaseAction baseAction;
public StaticProxy(BaseAction baseAction) {
this.baseAction = baseAction;
}
@Override
public void doSomething() {
System.out.println("before");
baseAction.doSomething();
System.out.println("before");
}
@Override
public void doSomething2() {
System.out.println("before");
baseAction.doSomething2();
System.out.println("before");
}}
然后写一个动态代理
public class DynamicProxy implements InvocationHandler {//为baseAction的所有方法做代理
private BaseAction baseAction;
public BaseAction getAction(BaseAction baseAction) {
this.baseAction = baseAction;
return (BaseAction) Proxy.newProxyInstance(baseAction.getClass().getClassLoader(), baseAction.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result;
//这里就可以进行所谓的AOP编程了
//在调用具体函数方法前,执行功能处理
System.out.println("before");
result = method.invoke(baseAction, args);
System.out.println("after");
//在调用具体函数方法后,执行功能处理
return result;
}}
测试
@Test
public void test() {
StaticProxy staticProxy = new StaticProxy(new PrintAction());
staticProxy.doSomething();
}
@Test
public void test2() {
DynamicProxy dynamicProxy = new DynamicProxy();
dynamicProxy.getAction(new PrintAction()).doSomething2();
}
总结
相比之下,可以发现,baseAction每添加一个方法,静态代理都需要为其添加代理
动态代理不需要为每个方法添加代理。