总结:
- .class.getResource() 和 .getClassLoader().getResource() 的区别,就是在加载资源文件的时候,加载方式的不同。
- .class.getResource("/") == .class.getClassLoader().getResource("")
两者都是从ClassPath根下任意路径获取资源。.class.getResource()最终调用.class.getClassLoader().getResource()方法。 - .class.getResource真正调用.class.getClassLoader().getResource()方法之前,会先获取文件的路径(path不以’/‘开头时,默认是从此类所在的包下取资源;path以’/'开头时,则是从项目的ClassPath根下获取资源)
- .class.getClassLoader().getResource()方法会通过双亲委派机制,先委派双亲去加载类,如果双亲没有加载到,则再由自己加载。(双亲委派机制并不是通过继承实现的,而是通过组合的方式实现)
- 当 .class.getClassLoader().getResource()方法的 path 以 ‘/’ 开头时,是从BootstrapClassLoader的加载范围加载,一定是返回null。
- BootstrapClassLoader称为启动类加载器,是用C/C++编写的,它并不是一个JAVA类,也就是无法在java代码中获取它的引用。是Java类加载层次中最顶层的类加载器,负责加载JDK中的核心类库,如:rt.jar、resources.jar、charsets.jar等,他的父类加载器为null。