Java 类如何找到资源?

Java 类如何找到资源?,java,classloader,Java,Classloader,类#getResourceAsStream(String)的JavaDoc如下: 查找具有给定名称的资源。搜索资源的规则 与给定类关联的对象由定义类实现 类的加载器。此方法委托给此对象的类 加载器 那么,以下工作是如何进行的: class AppTest { private static final Properties p = new Properties(); static { try { p.load(AppTest.

类#getResourceAsStream(String)
的JavaDoc如下:

查找具有给定名称的资源。搜索资源的规则 与给定类关联的对象由定义类实现 类的加载器。此方法委托给此对象的类 加载器

那么,以下工作是如何进行的:

class AppTest {
private static final Properties p = new Properties();    
    static {        
        try {
            p.load(AppTest.class.getResourceAsStream(("config.properties")));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
...
}
如果config.properties与AppTest.class位于同一目录中:

pro/wulfgar/net/on/users/app/{AppTest.class,config.properties} 
AppTest.class的类加载器不应该在应用程序类路径上查找它吗(在本例中为
)?因此,config.properties应该与pro目录处于同一级别


也就是说,除非我将资源定义为
pro/wulfgar/net/on/users/app/config.properties
,否则我无法理解为什么类加载器可以找到资源?

ClassLoader
由于包名的原因已经知道
AppTest.class
所在的目录。属性文件中没有此类信息。

请查看此信息


Class.getResourceAsStream和ClassLoader.getResourceAsStream之间存在差异。JavaDoc上的措辞可能会让您有点困惑。getResourceAsStream(String)将解析类引用(pro/wulfgar/net/on/users/app/config.properties)包中的资源。如果不希望以这种方式解析,可以在资源名称的开头添加“/”以指示它处于基本级别(如果遵循标准包约定,则为pro/wulfgar/config.properties)


JavaDoc的后半部分概述了这种行为。JavaDoc中引用的部分解释了它为该类委托给类加载器。由于每个类加载器都有一个单独的文件源(JAR或文件系统),它会区分特定类加载器的资源集。

那么,是AppTest.class的类加载器最终将config.properties加载到jvm中的吗?它只是在相同的包结构中搜索文件?如果我要使用ClassLoader.getResourceAsStream,它会(更愿意)在父类或应用程序类加载器(引导、扩展等)中搜索config.properties,直到找到资源?class.getResourceAsStream只需根据调用类的包名构造一个资源名(除非指定前导“/)。只需查看Class.getResourceAsStream的源代码(例如,使用Eclipse)。接下来发生什么取决于类加载器实现(即它是否首先检查父类加载器资源)