我正在从 Java 中的自定义类加载器从几个不同的 .jar 加载几个不同的类。我创建了一个 custom URLClassLoader
,向其中添加了几个 .jar 并将其传递给 aServiceLoader
以查找我想要的类。
我的问题是:给定一个类,有没有办法发现它是从哪个 .jar 加载的?
我正在从 Java 中的自定义类加载器从几个不同的 .jar 加载几个不同的类。我创建了一个 custom URLClassLoader
,向其中添加了几个 .jar 并将其传递给 aServiceLoader
以查找我想要的类。
我的问题是:给定一个类,有没有办法发现它是从哪个 .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 以找出它的来源。