2022-04-26

TestClassLoader.class.getClassLoader().getResource("")

  ClassLoader类中的getResource方法返回的是 file:/C:/myroad/utalitityUtils/target/classes/

TestClassLoader.class.getClassLoader().getResource("/")

  ClassLoader类中的getResource方法返回的是 null

对于ClassLoader.getResource, 直接调用的就是ClassLoader 类的getResource方法,

那么对于getResource(""),path不以'/'开头时,首先通过双亲委派机制,使用的逐级向上委托的形式加载的,最后发现双亲没有加载到文件,最后通过当前类加载classpath根下资源文件。

对于getResource("/"),'/'表示Boot ClassLoader中的加载范围,因为这个类加载器是C++实现的,所以加载范围为null。

最后进行一个总结,Class.getResource和ClassLoader.getResource的区别,就是在加载资源文件的时候,加载方式的不同,

class.getResource("/") == class.getClassLoader().getResource("")

其实,Class.getResource和ClassLoader.getResource本质上是一样的,都是使用ClassLoader.getResource加载资源的。

Class.getResource真正调用ClassLoader.getResource方法之前,会先获取文件的路径(path不以'/'开头时,默认是从此类所在的包下取资源;path以'/'开头时,则是从项目的ClassPath根下获取资源)。

ClassLoader.getResource方法会通过双亲委派机制,先委派双亲去加载类,如果双亲没有加载到,则再由自己加载。

你可能感兴趣的:(2022-04-26)