确定从哪里加载特定类

时间:2016-02-18 12:45:41

标签: java jvm classloader

有没有办法在运行时确定从哪里加载特定类?

我们正在使用一个应用程序服务器,它有几个地方放置外部库。现在有一个问题,例如,apache-commons库的几个不同版本放在不同的地方,没有人能真正告诉哪些JAR文件是特定Java类中的源。

有没有办法向类加载器询问它实际上从哪里加载类?具体的JAR文件是什么?

3 个答案:

答案 0 :(得分:4)

此信息存储在类ProtectionDomain中。您可以使用以下命令访问类的保护域:

Object o = new Object();
ProtectionDomain protection = o.getClass().getProtectionDomain();

在此对象中,有一个名为getCodeSource()的方法,它返回CodeSource,其中包含来自的位置的网址:

URL loadedFile = protection.getCodeSource().getLocation();

如果类加载器在加载时没有提供此信息,则此URL可以为null。

答案 1 :(得分:1)

我更愿意使用 Verbose类加载来诊断类加载问题。 可以使用-verbose:class作为JVM参数启用它。这会在加载类时打印出类,包括它们的jar文件名。

与此相关的一些问题: Java verbose class loading

答案 2 :(得分:1)

另一种查找类加载位置的方法(无需操作源)是使用选项-verbose:class启动Java VM。