1、需求在現(xiàn)有方法前后增加兩行日志
使用靜態(tài)代理
public interface Waiter {
public void serve();
}
public class ManWaiter implements Waiter {
@Override
public void serve() {
System.out.println("服務(wù)中");
}
}
public class ProxyWaiter implements Waiter{
private Waiter waiter;
public ProxyWaiter(Waiter waiter) {
this.waiter=waiter;
}
@Override
public void serve() {
System.out.println("執(zhí)行前");
waiter.serve();
System.out.println("執(zhí)行后");
}
}
可以發(fā)現(xiàn)使用靜態(tài)代理的缺陷:每個類都需要一個代理類。
使用動態(tài)代理
public class Test {
public static void main(String[] args) {
Waiter waiter=(Waiter)getProxy(new ManWaiter());
waiter.serve();
}
private static Object getProxy(Object target) {
Object proxy=Proxy.newProxyInstance(Test.class.getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("執(zhí)行前");
Object result = method.invoke(target, args);
System.out.println("執(zhí)行后");
return result;
}
});
return proxy;
}
}
靜態(tài)代理是在編譯寫好相應的代理類的java代碼,生成class字節(jié)碼,然后去創(chuàng)建代理對象。
動態(tài)代理:動態(tài)的創(chuàng)建一組指定接口的實現(xiàn)類對象。(動態(tài)代理直接根據(jù)接口和類加載器生成代理,跳過了java代碼生成class字節(jié)碼的過程)