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)代理的缺陷:每個(gè)類都需要一個(gè)代理類。
使用動(dòng)態(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)代理是在編譯寫好相應(yīng)的代理類的java代碼本今,生成class字節(jié)碼拆座,然后去創(chuàng)建代理對(duì)象主巍。
動(dòng)態(tài)代理:動(dòng)態(tài)的創(chuàng)建一組指定接口的實(shí)現(xiàn)類對(duì)象。(動(dòng)態(tài)代理直接根據(jù)接口和類加載器生成代理挪凑,跳過了java代碼生成class字節(jié)碼的過程)