有人知道如何通过编程找到java类加载器实际从哪里加载类吗?
我经常在大型项目中工作,其中类路径非常长,手动搜索实际上不是一个选择。我最近遇到了一个问题,类加载器加载了一个不正确的类版本,因为它位于类路径的两个不同的地方。
那么,如何让类加载器告诉我实际的类文件来自磁盘的哪个位置呢?
编辑:如果类加载器实际上由于版本不匹配(或其他原因)而无法加载类,我们是否可以在它读取文件之前找到它试图读取的文件?
有人知道如何通过编程找到java类加载器实际从哪里加载类吗?
我经常在大型项目中工作,其中类路径非常长,手动搜索实际上不是一个选择。我最近遇到了一个问题,类加载器加载了一个不正确的类版本,因为它位于类路径的两个不同的地方。
那么,如何让类加载器告诉我实际的类文件来自磁盘的哪个位置呢?
编辑:如果类加载器实际上由于版本不匹配(或其他原因)而无法加载类,我们是否可以在它读取文件之前找到它试图读取的文件?
当前回答
通常情况下,我们不会使用硬编码。我们可以先获取className,然后使用ClassLoader获取类URL。
String className = MyClass.class.getName().replace(".", "/")+".class";
URL classUrl = MyClass.class.getClassLoader().getResource(className);
String fullPath = classUrl==null ? null : classUrl.getPath();
其他回答
简单的方法:
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();
这是我们使用的:
public static String getClassResource(Class<?> klass) {
return klass.getClassLoader().getResource(
klass.getName().replace('.', '/') + ".class").toString();
}
这取决于ClassLoader的实现: .getLocation .getCodeSource .getProtectionDomain getClass () () () ()
另一种查找类从何处装入的方法(无需操作源)是使用选项:-verbose:class启动Java VM
当对象的ClassLoader被注册为空时,Jon的版本就失败了,这似乎意味着它是由Boot ClassLoader加载的。
这个方法可以解决这个问题:
public static String whereFrom(Object o) {
if ( o == null ) {
return null;
}
Class<?> c = o.getClass();
ClassLoader loader = c.getClassLoader();
if ( loader == null ) {
// Try the bootstrap classloader - obtained from the ultimate parent of the System Class Loader.
loader = ClassLoader.getSystemClassLoader();
while ( loader != null && loader.getParent() != null ) {
loader = loader.getParent();
}
}
if (loader != null) {
String name = c.getCanonicalName();
URL resource = loader.getResource(name.replace(".", "/") + ".class");
if ( resource != null ) {
return resource.toString();
}
}
return "Unknown";
}