[英]How does the Classloader in Java know which file resource to load if there are duplicates?
如果对此问题的答案很简单,我预先表示歉意。 似乎我对Java中的类加载没有足够的了解。
假设我的应用程序中有一个名为“ properties”的文件。 我的应用程序使用外部JAR,并且在该JAR内部,还有一个名为“ properties”的文件。
题:
如果外部JAR文件尝试使用getClass().getClassLoader().getResourceAsStream("properties")
打开该文件,为什么不从我的应用程序中加载该文件。 不是我想要它,但是在这种情况下ClassLoader不会成为加载我的应用程序的那个吗? 我认为该方法将使用绝对路径来查找资源。 外部JAR中的类是否使用其他类加载器加载?
对于类和资源,类加载机制是相同的(但是所找到的字节将被不同地对待)。
有关正式说明,请参见http://docs.oracle.com/javase/tutorial/ext/basics/load.html 。
实际询问的是一流的装载机,它具有赢得资源。 如果类加载器没有资源,请与父级一起重试。
(请注意,对于Web应用程序-WAR文件-故意在先询问哪个方面略有不同)。
不,它将加载在该类的类加载器中找到的第一个。 如果要使用绝对路径打开文件,请打开一个指向该文件的InputStream
。 可以使用不同的类加载器(例如,在Java EE容器中)加载外部JAR中的类,但是随后需要链接类加载器,以便您查看它们。
ClassLoader#getResourceAsStream(String)
调用父对象的getResource(String)
并将其作为getResource()。 如果找不到任何东西,它将询问类加载器findResource(String)
。
它取决于此实现的返回结果,如果是URLClassLoader
它将是URLClassPath.findResource()
,它逐步遍历所有加载程序(每个搜索路径条目一个加载程序)并返回第一个查找结果。
在普通应用程序中,您的JAR和所有库都由相同的(应用程序)类加载器加载。 对于Sun启动器,它是sun.misc.Launcher$AppClassLoader
,它扩展了URLClassLoader
。 它将来自类路径的所有JAR和类放入搜索列表。
最好使资源具有唯一性(将其放入程序包中)或检索所有资源并选择正确的一个(或全部)资源。 例如,后者在ServiceLoader查找给定服务的所有实现时使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.