2009-11-05 56 views
6

是否有任何方法替代(重寫)一個Java類實現,該實現已由另一個實現(可作爲字節數組使用)由System類加載器加載?在運行時替換(覆蓋)類實現(Java)

爲說明我的疑問,跟隨該碼:

public class Main { 
    public static void main(String ... args) { 
     Foo foo = new Foo(); 
     foo.print(); 

     ClassLoader cl = ... 

     Foo foo2 = (Foo) cl.newInstance(); 
     foo2.print(); 
    } 
} 

第一富打印「執行1」的打印()方法,如第二個打印「實施2」。 foo的第二個實例由類加載器從字節數組中檢索(可以存儲在文件中,或者從任何流中獲取...)

PS:是Foo是類的要求,而不是一個接口,並且不能被擴展,即,定義類實現的實際字節(VM內部)被覆蓋。

+0

你是否確實想要這樣做?這將是很好的解釋爲什麼在這個問題上。 – 2009-11-05 20:41:48

回答

0

CGLib做這樣的事情。它在Spring中用於此目的的Spring &。

0

您可以實現一個儀表代理並使用java.lang.instrument.Instrumentation#redefineClasses(...)來替換已經加載的類的字節碼。

4

是的,這是沒有問題的。你應該使用java.net.URLClassLoader。例如,你可以給它一個url,它是你的壓倒一切的Foo.class文件所在的目錄。

編輯: 然後你想要的電話是cl.loadClass("Foo").newInstance()。您不能將結果轉換爲Foo,但可以使用反射來調用其print方法。或者讓Foo成爲一個你不會重新實現的子類(或接口實現),它定義了一個print方法,並將其轉換爲此類方法。

0

我使用JMX取消部署和重新部署類。