簡體   English   中英

在運行時替換(覆蓋)類實現(Java)

[英]Substitute (override) class implementation at Runtime (Java)

是否有任何替代(重寫)Java類實現的方法,該類實現已由另一個實現(由字節數組提供)由System類加載器加載?

為了說明我的疑問,請遵循以下代碼:

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

        ClassLoader cl = ...

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

第一個Foo的print()方法打印“Implementation 1”,第二個打印“Implementation 2”。 foo的第二個實例由類加載器從一個字節數組中檢索(可以存儲在文件中,也可以從任何流中獲取......)

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

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

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

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

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM