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)相关文章推荐
- Class.getResourceAsStream和ClassLoader.getResourceAsStream
- Java提高班 之深究java.lang.Class.getResource(String)与java.lang.ClassLoader.getResource(String)
- Class.getResource()、ClassLoader.getResource()、ClassLoader.getSystemResource()区别
- JAVA 笔记 ClassLoader.getResourceAsStream() 与 Class.getResourceAsStream()的区别
- [java]getClass()、getClassLoader()、getResource()、getResourceAsStream()区别
- Class.getResourceAsStream() & ClassLoader的getResourceAsStream()
- getResource的用法对于class和classloader
- Class.getResourceAsStream和ClassLoader.getResourceAsStream
- Class.getResource和ClassLoader.getResource的区别分析
- 关于Class.getResource和ClassLoader.getResource的路径问题
- Class.getResource和ClassLoader.getResource的路径问题
- Class.getResource和ClassLoader.getResource的区别分析
- ClassLoader.getResourceAsStream(name); 路径问题
- 关于Class.getResource和ClassLoader.getResource的路径问题
- class.getResource()和classLoader.getResource();和request获取路径
- java文件路径问题及getResource和getClassLoader().getResource的区别
- getClassLoader & getResource
- Class.forName() 初始化、Thread.currentThread().getContextClassLoader().getResourceAsStream
- Class.getResource和ClassLoader.getResource的路径写法
- 对Class.getResourceAsStream和ClassLoader.getResourceAsStream方法所使用的资源路径的解释 (转)