【发布时间】:2017-08-10 23:36:27
【问题描述】:
今天,我很惊讶(可能是由于缺乏经验)发现您可以,而且实际上很有用,将一个空路径(字面意思是一个空字符串)传递给ClassLoader.getResources,即
ClassLoader.getSystemClassLoader().getResources("")。通过一些测试,这会返回我的应用程序 .class 文件所在的一个或两个目录(并且不包括第 3 方包的目录)。 (用法示例:Get all of the Classes in the Classpath。)
大概是因为 Java System ClassLoader 是加载我自己的应用程序类的三个 ClassLoader 之一(c.f.http://www.oracle.com/technetwork/articles/javase/classloaders-140370.html),所以返回的 URL 指向我的应用程序类文件的目录也就不足为奇了。
但是,空字符串为什么以及如何实现这一点呢?我没有发现它记录在案。这个空路径是更常见的 Java 约定的派生词吗?它肯定不是 Linux - 你不能 cd 进入 bash 中的空路径。如果有人能帮助我理解这一点,我将不胜感激。
在另一个注释中,我注意到getResources(".") 实现了同样的目标。
添加评论讨论
public class myTest {
public static void main(String[] args) throws Exception {
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
URL[] urls = ((URLClassLoader) classLoader).getURLs();
for (int n = 0; n < urls.length; n++)
System.out.println(urls[n]); //lists external.jar
Enumeration<URL> roots = classLoader.getResources(".");
while (roots.hasMoreElements()) {
URL url = roots.nextElement();
System.out.println("getResources: " + url); //does not list external.jar
}
}
}
要执行的命令:java -cp ".:external.jar" myTest
【问题讨论】:
-
该链接有助于清除 ClassLoader 以及 Custom ClassLoader,在链接末尾我们可以看到,当 JVM 使用 Java 选项启动时,我们如何将自定义类加载器设为默认值. journaldev.com/349/java-classloader
标签: java classloader urlclassloader