1)有Somelib其在SomeProject加入作爲罐。Java庫架構
2)在SomeProject存在somePackage.SomeClass它實現SomeLib.SomeInterface。
3)SomeLib必須能夠在不每次
建設SomeLib創建somePackage.SomeClass情況下怎麼可能不使用反射?這是不可能寫在SomeLib東西像進口somePackage.Someclass。
我正在使用Netbeans。
PS我是Java新手,我試圖儘可能清楚。
1)有Somelib其在SomeProject加入作爲罐。Java庫架構
2)在SomeProject存在somePackage.SomeClass它實現SomeLib.SomeInterface。
3)SomeLib必須能夠在不每次
建設SomeLib創建somePackage.SomeClass情況下怎麼可能不使用反射?這是不可能寫在SomeLib東西像進口somePackage.Someclass。
我正在使用Netbeans。
PS我是Java新手,我試圖儘可能清楚。
你只可以添加一個硬編碼的依賴,但是你應該避免不惜一切代價,如果你正在計劃重新使用你的庫(即使你不這樣做)
而是使用這種模式:
創建廠用於在庫中創建SomeInterface
實現。 (有關更多信息,請參閱Factory method pattern)
在SomeProject
中,您必須在該工廠註冊SomeClass
。你可以使用一個靜態的初始化程序與Class.forName
相結合。
public class SomeClass {
static {
SomeFactory.registerSomeImplementation(SomeClass.class)
}
}
Class.forName("somePackage.SomeClass") // Alternative 1
SomeClass.class.getName(); // Alternative 2
這兩種方法都加載類並運行靜態初始化程序,但第二種方法提供了一些更好的重構機會。 不要與Class.forName
混淆:其他答案建議使用它在庫中創建SomeClass
實例。但是在這裏,您可以在項目中使用它來加載類,從而運行靜態初始化程序。
SomeLib
然後可以使用工廠爲SomeInterface
創建一個實例。
SomeInterface si = SomeFactory.createSomeObject();
你可以嘗試實例化這個類:
Class.forName("com.bla.yourclass").newInstance();
是的,但在過量用藥的情況下,SomeLib不會知道SomeInterface實現者的姓名(鬆耦合) – 2009-09-29 08:10:16
我想聲明的類,實現在classpath中的平面文件(或Java屬性或XML),你的界面。你的庫可以查找文件,讀取類名和創建實例。我認爲,這是一種典型的方法。
然後,您不需要反射來搜索實現器的類路徑,而只需要調用來創建實例。
你也可以使用一個原型,根據生命週期 – wds 2009-09-29 09:32:20