簡(jiǎn)單代理
重點(diǎn)在于代理類和被代理類實(shí)現(xiàn) 同一個(gè) 接口芝发。
// 接口
public interface MyInterface {
void doSomething();
void somethingElse(String arg);
}
// 被代理類
public class RealObject implements MyInterface {
public void doSomething() {
System.out.println("RealObject.doSomething().");
}
public void somethingElse(String arg) {
System.out.println("RealObject.somethingElse(" + arg + ").");
}
}
// 代理類
public class MyInterfaceProxy implements MyInterface {
private MyInterface proxy;
private int cnt = 0;
public MyInterfaceProxy(MyInterface proxy) {
this.proxy = proxy;
}
public void doSomething() {
System.out.println("Proxy.doSomething() called: " + ++cnt);
proxy.doSomething();
}
public void somethingElse(String arg) {
System.out.println("Proxy.somethingElse(" + arg + ").");
proxy.somethingElse(arg);
}
}
// 測(cè)試
public class TestProxy {
public static void testProxy(MyInterface mi) {
mi.doSomething();
mi.doSomething();
mi.somethingElse("bang-bang-bang");
}
public static void main(String[] args) {
MyInterface mi1 = new MyInterfaceProxy(new RealObject());
testProxy(mi1);
}
}
動(dòng)態(tài)代理
從上面可以看到,丫的苛谷,代理類必須實(shí)現(xiàn)跟被代理類一樣的接口辅鲸,這種簡(jiǎn)直屬于沒天理的行為。所以Java提供了InvocationHandler
來實(shí)現(xiàn)動(dòng)態(tài)代理抄腔。運(yùn)用到的原理包括:
- Object作為所有類的基類瓢湃,被代理類會(huì)被轉(zhuǎn)化為此類型理张。
- 反射機(jī)制赫蛇。