ClassLoader#getResource和Class#getResource

  • ClassLoader#getResource(String name)
    ClassLoader使用双亲委派模型去查找文件资源,先Bootstrap,再ExtClassLoader,最后AppClassLoader,返回的是target/classes或者target/test-classes
public URL getResource(String name) {
    
    
    URL url;
    if (parent != null) {
    
    
        url = parent.getResource(name);
    } else {
    
    
        url = getBootstrapResource(name);
    }
    if (url == null) {
    
    
        url = findResource(name);
    }
    return url;
}
  • Class#getResource(String name)
    源码中先将文件路径定位到当前文件所在的路径下,然后优先获取用户使用的Class中的ClassLoader,如果为null(一般情况下都是AppClassLoader),调用ClassLoader.getSystemResource(name);方法,这个方法中调用了ClassLoader#getSystemClassLoader(),此方法通常返回的是AppClassLoader
public java.net.URL getResource(String name) {
    
    
    name = resolveName(name);
    ClassLoader cl = getClassLoader0();
    if (cl==null) {
    
    
        // A system class.
        return ClassLoader.getSystemResource(name);
    }
    return cl.getResource(name);
}

private String resolveName(String name) {
    
    
    if (name == null) {
    
    
        return name;
    }
    if (!name.startsWith("/")) {
    
    
        Class<?> c = this;
        while (c.isArray()) {
    
    
            c = c.getComponentType();
        }
        String baseName = c.getName();
        int index = baseName.lastIndexOf('.');
        if (index != -1) {
    
    
            name = baseName.substring(0, index).replace('.', '/')
                +"/"+name;
        }
    } else {
    
    
        name = name.substring(1);
    }
    return name;
}

Guess you like

Origin blog.csdn.net/qq_30038111/article/details/111827448