2012-02-23 36 views
0

我正在使用Eclipse,我的項目中包含兩個庫foo.jar和bar.jar。在這兩個JAR中都有一個包含getFoobar(Object xy)方法的類FooBar.java。從Java構建浴中加載方法和類

現在我想無論是從foo.jar中或從bar.jar一個屬性的基礎上,裝入方法getFoobar(對象XY)文件:

config.properties: 選擇= FOO

如果選擇== foo,則應選擇Foo.jar的方法,否則將從Bar.java獲取方法getFoobar(Object xy)。爲了使事情更加複雜,方法getFoobar(Object xy)在其方法聲明中具有從另一個包含在foo.jar(分別爲bar.jar)中的JAR中加載的對象。

所以我的問題是。如何通過Reflections獲得JAR的方法?我還沒有找到解決方案。有沒有辦法解決這個問題?

謝謝。

埃默拉爾

+0

你爲什麼試圖通過refelction。嘗試通過使用InstanceOf運算符的檢查對象或使用工廠模式並調用適當的方法 – developer 2012-02-23 13:20:43

回答

0

只能加載一個或其他方法,而用的類加載器越來越複雜。一個簡單的解決方法是使用jarjar重命名一個或兩個庫的包。這允許您將foo.jar中的所有內容都以foo.開頭,並且所有內容都是bar.jar,並以bar.開頭,這樣可以避免混淆。我已經看到過,這可以根據配置加載幾個版本的Xerces(並在同一應用程序中同時使用它們)

+0

好吧,我認爲這將是一個不平凡的問題... @Damodar:InstanceOf運算符沒有任何意義,因爲有一個加載類Foobar.java的複雜性。正如Peter所說,只能從一個庫中加載它。這就是我問過的原因。 – 2012-02-23 13:28:49

0

編寫讀取屬性的ClassLoader。另外,您也可以在JVM參數

-Dchoice=foo 

,並使用-D選項從foo.jar中或bar.jar您可以在此屬性值切換加載類的代碼:

String choice = System.getProperty("choice"); 
if (Main.CHOICE_FOO.equalsIgnoreCase(choice)) {...} 
... 
0

OSGI可以爲您提供類似的功能。

0

如何通過Reflections分別獲取JAR的方法?

你不行。

反射不允許您在該類的兩個版本之間進行選擇。實際上,就JVM而言,只有一個版本;即在類路徑上最早出現的那個。

您可以通過定義多個類加載器來解決這個問題,每個類加載器都具有不同的類路徑。然而,有併發症:

  • 如果你能版本的類加載到運行的應用程序,你會發現,各個類別的情況下有不同的類型,你將無法否則說服JVM。

  • 當您的應用程序加載另一個靜態地依賴於這些類之一的類時,它將綁定到依賴類classloader的類路徑上的類的版本。你不能改變這一點。因此,在依賴類中的聲明/類型名稱/類別名稱中使用類名稱將引用依賴類類加載器找到的類的版本,而不是另一個。

結果是,你不能像常規類那樣使用這些相同名稱的類...特別是如果兩個版本都需要在同一個JVM中加載。給這個類的兩個版本不同的名字是一個更好的主意。通過使類名相同,您不會獲得任何收益。