如果想在運行時生成新的對象,并且這個對象的類型是全新的,是現(xiàn)有系統(tǒng)中沒有的。就可以用Proxy類中的靜態(tài)方法newProxyInstance來實現(xiàn)。其API如下:
public static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler handler);
參數(shù):
- loader: 類加載器。如果為null,就要默認(rèn)類加載器
- interfaces: 這個新類要實現(xiàn)的接口組
- 調(diào)用處理器。
函數(shù)返回的對象類型是$Proxyn, (n >= 0. 第一次調(diào)用這個方法,新類名為$Proxy0, 第二個新類名為$Proxy1, 以此類推)
生成的$Proxyn 的源代碼大致類似如此:
public final class $Proxy0 implements interfaces {
InvocationHandler handler;
public String toString() {
Method m = this.getClass().getMethod("toString");
handler.invoke(this, m, m.getParameters());
}
Method m = this.getClass().getMethod("hashCode");
handler.invoke(this, m, m.getParameters());
}
public String equals() {
Method m = this.getClass().getMethod("equals");
handler.invoke(this, m, m.getParameters());
}
// 以下是實現(xiàn)interfaces的方法
public return_type interfaces_method(args...) {
Method m = this.getClass().getMethod("equals");
handler.invoke(this, m, m.getParameters());
}
... ...接口interfaces中的其他方法
}
當(dāng)我們這樣調(diào)用時: Object o = Proxy.newProxyInstance(null, interfaces, handler0);
就生成一個新$Proxy0類的對象o, 這個對象o的字段handler被賦值為handler0。$Proxy0實現(xiàn)了interfaces中所有的接口,其實現(xiàn)方式都一樣,就是調(diào)用字段handler的invoke方法。其UML圖如下: