2012-02-25 99 views
1

我已經更改了共享庫中的類的包。我有消費者A和B消費這個圖書館。消費者A也使用消費者B.Java是否支持類型轉發?

我正在使用Consumer A,我已經更新了共享庫的.jar文件。現在在運行時,我得到一個java.lang.NoClassDefFoundError爲舊的包,大概,因爲消費者B仍然使用它(這是使用春季DI,有大量的依賴關係,我剛開始在Java中工作,所以我不是100%確定,但它可能來自哪裏)。

在.net中,我可以使用Type Forwarding來臨時修復這種情況,直到我還可以更新Consumer B.在Java中是否也存在類似的機制? (「當有人要求de.stum.old.MyObject時,請將它們發送到de.stum.new.MyObject而不是」)

+0

什麼是「命名空間」?你的意思是「包裝」? – yegor256 2012-02-25 02:24:35

+0

@ yegor256啊,是的,謝謝!更新了問題 – 2012-02-25 02:30:02

回答

2

不,JVM沒有類型轉發功能。您必須採取另一種方法:

您可以將新類定義爲舊類的子類(或其他方法),並且保留兩個類直到所有使用者都更新。當然,唯一允許消費者向一個方向傳遞MyObjects。

如果你不需要賦值兼容性,你可以同時加載舊的和新的jar(假設沒有名稱衝突,例如因爲所有的類都被移動到一個新的包中。衝突,你可能希望使用單獨的類加載器來解決它們)。

當然,如果你想獲得真正的幻想,當你使用字節碼操作庫加載引用類時,可以替換移動類的引用。