2012-04-15 23 views
0

在一個項目中,我需要在特定的目錄下加載不同的jar文件。然後我將搜索.class文件,這些文件實現了特定的interface。當我發現搜索一個,我需要加載它與Class.forName()。有沒有簡單的方法來做到這一點?你能提出一些示例代碼嗎?jar中的列表和加載類

回答

1

如果您在一個普通的Java應用程序中並且想要定義接口< - > Implementation(s)映射,我也喜歡Mark的方法。

做你想做的事情的另一種方法我認爲是修補類路徑掃描,你考慮當前正在運行的類路徑並使用它通過註釋或接口查找組件。

這方面的流行示例例如Spring

要在Spring以外使用,你可以嘗試使用一些庫,如ReflectionsClass-Search,它們提供了一個在類路徑中搜索的API。

由於我最近用Vaadin/GWT和他們的方法來找到當前類路徑中的某些東西,this class從他們的工具可能對你很有趣,如果你想手動實現類似的東西。

但是就像Martijn已經提到的那樣,這些解決方案需要將JAR添加到類路徑中,以便類加載並解析找到的組件。

如果這很關鍵,你不能先加載並解釋它,那麼你可以嘗試在類庫之上構建一些東西,比如ASM,它可能會提供對.class文件的解釋而不加載類。

1

我敢肯定,你不能檢查類是否實現了一個特定的接口,而無需首先加載它。所以,我認爲你必須加載每個班級文件或嘗試解決你的問題/以不同的方式實現你的目標。

您可以嘗試讀取.class文件二進制文件,並在字節代碼中找到它實現的接口,但不要問我該怎麼做。 :)

+0

是的,你是對的。我的實際問題是找到完整的類名(帶有包),因爲Class.forName()期待全名。事先我不知道jar中的類名。 – cacert 2012-04-15 09:58:03

3

看看ServiceLoader。這確實要求這些類的實現者在/META-INF/services/<fqn-of-interface>中提供一個描述性文件,其中列出了該接口的jar提供的所有實現類。

+0

它似乎可以補救我的問題。我會谷歌一些示例代碼。謝謝。 – cacert 2012-04-15 10:12:46