我从Java中的自定义类加载器从几个不同的.jars加载了几个不同的类。我创建了一个自定义URLClassLoader
,向其中添加了几个.jars并将其传递给ServiceLoader
以查找我想要的类。
我的问题是:给定一个课程,有没有办法发现它是从哪个.jar加载的?
答案 0 :(得分:5)
以下代码段应该有效:
obj.getClass().getProtectionDomain().getCodeSource().getLocation().toString()
请注意,在调用getProtectionDomain或getCodeSource并在任何生产代码中正确处理时,应添加null检查。 (这取决于类加载器,安全性等)
答案 1 :(得分: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]
这应该给你所有你需要知道的东西,找到你想要的类/ jar。
答案 2 :(得分:2)
您可以在Classloader上调用findResource,并解析您获取的URL以确定其来源。