Javaのカスタムクラスローダーからいくつかの異なる.jarからいくつかの異なるクラスをロードしています。カスタムを作成しURLClassLoader
、それにいくつかの.jarを追加し、それをに渡して、必要なServiceLoader
クラスを見つけます。
私の質問は次のとおりです。クラスが与えられた場合、それがロードされた.jarを見つける方法はありますか?
Javaのカスタムクラスローダーからいくつかの異なる.jarからいくつかの異なるクラスをロードしています。カスタムを作成しURLClassLoader
、それにいくつかの.jarを追加し、それをに渡して、必要なServiceLoader
クラスを見つけます。
私の質問は次のとおりです。クラスが与えられた場合、それがロードされた.jarを見つける方法はありますか?
次のスニペットが機能するはずです。
obj.getClass().getProtectionDomain().getCodeSource().getLocation().toString()
getProtectionDomain または getCodeSource を呼び出すときに null のチェックを追加し、運用コードで適切に処理する必要があることに注意してください。(クラスローダやセキュリティなどに依存します)
パラメータを設定してみる
-verbose:class
javaを使用して jar/class を実行すると、読み込まれるクラスとその起源の完全な概要が表示されます。
[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]
これで、必要なクラス/jar を見つけるために必要な情報がすべて得られるはずです。
Classloader で findResource を呼び出し、取得した URL を解析して、それがどこから来ているかを把握できます。