2009-07-06 31 views
2

我從Java中的自定義類加載器加載了幾個不同的.jars中的幾個不同的類。我創建了一個自定義URLClassLoader,爲它添加了幾個.jars並將它傳遞給ServiceLoader以查找我想要的類。如何發現哪個類路徑條目提供了一個類?

我的問題是:給定一個類,有沒有辦法發現它是從哪裏加載的.jar?

回答

2

你可以在Classloader上調用findResource,並解析你得到的URL來確定它來自哪裏。

3

嘗試設置參數

-verbose:class 

運行使用的Java您的JAR /類時,它會給你的類加載和它們的來源,例如一個完整的破敗:

[Opened /usr/java/j2sdk1.4.1/jre/lib/rt.jar] 
[Opened /usr/java/j2sdk1.4.1/jre/lib/sunrsasign.jar] 
[Opened /usr/java/j2sdk1.4.1/jre/lib/jsse.jar] 
[Opened /usr/java/j2sdk1.4.1/jre/lib/jce.jar] 
[Opened /usr/java/j2sdk1.4.1/jre/lib/charsets.jar] 
[Loaded java.lang.Object from /usr/java/j2sdk1.4.1/jre/lib/rt.jar] 
[Loaded java.io.Serializable from /usr/java/j2sdk1.4.1/jre/lib/rt.jar] 

這應該給你所有你需要知道找到你想要的類/罐子。

+0

哦,不,我不想追查問題。我實際上想要找到.jar的位置,這樣我就可以在運行時相對於它的路徑做些事情。 – 2009-07-06 02:47:28

+0

好吧,你的問題是我猜的罐子的位置。無論如何,它應該給你不管你想要的JAR的確切路徑... – Jon 2009-07-06 02:55:31

5

下面的片段應該工作:

obj.getClass().getProtectionDomain().getCodeSource().getLocation().toString() 

請注意,您應該調用getProtectionDomain或getCodeSource當空加檢查,並在任何生產代碼妥善處理。 (這取決於班級加載器,安全等)

相關問題