2

我正在从 Java 中的自定义类加载器从几个不同的 .jar 加载几个不同的类。我创建了一个 custom URLClassLoader,向其中添加了几个 .jar 并将其传递给 aServiceLoader以查找我想要的类。

我的问题是:给定一个类,有没有办法发现它是从哪个 .jar 加载的?

4

3 回答 3

5

以下代码段应该可以工作:

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

请注意,您应该在调用 getProtectionDomain 或 getCodeSource 时添加对 null 的检查,并在任何生产代码中进行适当处理。(这取决于类加载器、安全性等)

于 2009-07-06T03:23:59.220 回答
3

尝试设置参数

-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。

于 2009-07-06T02:31:55.547 回答
2

您可以在 Classloader 上调用 findResource,并解析您获得的 URL 以找出它的来源。

于 2009-07-06T03:20:46.357 回答