有人知道如何通过编程找到java类加载器实际从哪里加载类吗?
我经常在大型项目中工作,其中类路径非常长,手动搜索实际上不是一个选择。我最近遇到了一个问题,类加载器加载了一个不正确的类版本,因为它位于类路径的两个不同的地方。
那么,如何让类加载器告诉我实际的类文件来自磁盘的哪个位置呢?
编辑:如果类加载器实际上由于版本不匹配(或其他原因)而无法加载类,我们是否可以在它读取文件之前找到它试图读取的文件?
有人知道如何通过编程找到java类加载器实际从哪里加载类吗?
我经常在大型项目中工作,其中类路径非常长,手动搜索实际上不是一个选择。我最近遇到了一个问题,类加载器加载了一个不正确的类版本,因为它位于类路径的两个不同的地方。
那么,如何让类加载器告诉我实际的类文件来自磁盘的哪个位置呢?
编辑:如果类加载器实际上由于版本不匹配(或其他原因)而无法加载类,我们是否可以在它读取文件之前找到它试图读取的文件?
当前回答
简单的方法:
System.out.println (java.lang.String.class.getResource (String.class.getSimpleName () + " . class "));
例子:
jar:文件:/ D: / Java / jdk1.8 / jre / lib / rt.jar ! / Java / lang / String.class
Or
String obj = "简单测试"; System.out.println (obj.getClass () .getResource (obj.getClass () .getSimpleName () + " . class "));
例子:
jar:文件:/ D: / Java / jdk1.8 / jre / lib / rt.jar ! / Java / lang / String.class
其他回答
getClass().getProtectionDomain().getCodeSource().getLocation();
这里有一个例子:
package foo;
public class Test
{
public static void main(String[] args)
{
ClassLoader loader = Test.class.getClassLoader();
System.out.println(loader.getResource("foo/Test.class"));
}
}
这打印出来:
file:/C:/Users/Jon/Test/foo/Test.class
看看这个类似的问题。 工具发现相同的类..
我认为最相关的障碍是如果你有一个自定义类加载器(从db或ldap加载)
简单的方法:
System.out.println (java.lang.String.class.getResource (String.class.getSimpleName () + " . class "));
例子:
jar:文件:/ D: / Java / jdk1.8 / jre / lib / rt.jar ! / Java / lang / String.class
Or
String obj = "简单测试"; System.out.println (obj.getClass () .getResource (obj.getClass () .getSimpleName () + " . class "));
例子:
jar:文件:/ D: / Java / jdk1.8 / jre / lib / rt.jar ! / Java / lang / String.class
对于单元测试
如果你需要一个叫做cover .java的类的位置,它位于包com.acme.api中
Class clazz = Coverage.class;
ClassLoader loader = clazz.getClassLoader();
String coverageClazzCompiledAbsoluteTargetLocation = loader
.getResource(clazz.getCanonicalName().replace(".", File.separator) + ".class")
.getFile().replace(File.separatorChar + "$", "");
System.out.println(coverageClazzCompiledAbsoluteTargetLocation);
结果
/home/Joe/repositories/acme-api/target/test-classes/com/acme/api/Coverage.class
注意:由于java需要编译,您无法获得.java位置(src/main/java/…)您需要将.java编译为.class,因此如果您使用maven,位置将在目标文件夹内
运行时:JAR
如果你以jar的形式构建应用程序,类的位置将是jar的位置加上clazz包
运行时:WAR
如果你将应用构建为war,类的位置将是war位置(tomcat中的/bin文件夹)加上clazz包