您的位置:首页 > 编程语言 > Java开发

Class.getResource和ClassLoader.getResource

2017-01-18 00:00 447 查看
摘要: 简单整理Class.getResource和ClassLoader.getResource。

一、Java类加载的架构图



二、Class.getResource

源码:

public java.net.URL getResource(String name) {
name = resolveName(name);
ClassLoader cl = getClassLoader0();
if (cl==null) {
// 对象被Bootstrap类加载器加载
return ClassLoader.getSystemResource(name);
}
return cl.getResource(name);
}

三、ClassLoader.getResource

源码:

public URL getResource(String name) {
URL url;
if (parent != null) {
// 通过父加载器找资源
url = parent.getResource(name);
} else {
// 通过Bootstrap类加载器找资源
url = getBootstrapResource(name);
}
if (url == null) {
// 可自定义类加载器找资源
url = findResource(name);
}
return url;
}

四、基本应用

测试的代码:

/**
* @author Kevin
* @date 2017-01-18
*/
public class ResourceTest {

public static void main(String[] args) {

// 返回根目录
System.out.println("ResourceTest.class.getResource(\"/\") -> " + ResourceTest.class.getResource("/"));

// 返回当前路径
System.out.println("ResourceTest.class.getResource(\"\") -> " + ResourceTest.class.getResource(""));

/**
* 查找classloader root
* getClassLoader最容易出问题,因为是根据类加载器来的,类加载器多种多样可能在不同环境下产生不同结果
*/
ResourceTest ResourceTest = new ResourceTest();
System.out.println("ResourceTest.getClass().getClassLoader().getResource(\"\") -> "
+ ResourceTest.getClass().getClassLoader().getResource(""));

System.out.println("ResourceTest.getClass().getClassLoader().getResource(\"/\") -> "
+ ResourceTest.getClass().getClassLoader().getResource("/"));

/**
* 从输出结果来看总结上述:
*  Class.class.getResource("/")  ==  Class.getClass().getClassLoader().getResource("")
*/
// 避免在不同Web容器下获取路径异常的方法
System.out.println("ResourceTest.class.getProtectionDomain().getCodeSource().getLocation().getPath() -> "
+ ResourceTest.class.getProtectionDomain().getCodeSource().getLocation().getPath());
}

}

测试结果:

ResourceTest.class.getResource("/") -> file:/developWorkspace/aliyun/easyjava/target/classes/
ResourceTest.class.getResource("") -> file:/developWorkspace/aliyun/easyjava/target/classes/com/zkj/java/easyjava/resource/
ResourceTest.getClass().getClassLoader().getResource("") -> file:/developWorkspace/aliyun/easyjava/target/classes/
ResourceTest.getClass().getClassLoader().getResource("/") -> null
ResourceTest.class.getProtectionDomain().getCodeSource().getLocation().getPath() -> /developWorkspace/aliyun/easyjava/target/classes/

五、参考文章

1.Class.getResource和ClassLoader.getResource区别与分析(http://blog.csdn.net/wenniuwuren/article/details/48041019)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息