我從Java中的自定義類加載器加載了幾個不同的.jars中的幾個不同的類。我創建了一個自定義URLClassLoader
,爲它添加了幾個.jars並將它傳遞給ServiceLoader
以查找我想要的類。如何發現哪個類路徑條目提供了一個類?
我的問題是:給定一個類,有沒有辦法發現它是從哪裏加載的.jar?
我從Java中的自定義類加載器加載了幾個不同的.jars中的幾個不同的類。我創建了一個自定義URLClassLoader
,爲它添加了幾個.jars並將它傳遞給ServiceLoader
以查找我想要的類。如何發現哪個類路徑條目提供了一個類?
我的問題是:給定一個類,有沒有辦法發現它是從哪裏加載的.jar?
你可以在Classloader上調用findResource,並解析你得到的URL來確定它來自哪裏。
嘗試設置參數
-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]
這應該給你所有你需要知道找到你想要的類/罐子。
下面的片段應該工作:
obj.getClass().getProtectionDomain().getCodeSource().getLocation().toString()
請注意,您應該調用getProtectionDomain或getCodeSource當空加檢查,並在任何生產代碼妥善處理。 (這取決於班級加載器,安全等)
哦,不,我不想追查問題。我實際上想要找到.jar的位置,這樣我就可以在運行時相對於它的路徑做些事情。 – 2009-07-06 02:47:28
好吧,你的問題是我猜的罐子的位置。無論如何,它應該給你不管你想要的JAR的確切路徑... – Jon 2009-07-06 02:55:31