class.getResource和getClassLoader().getResource

getResouce()java获取相对ClassPath的资源的方法,一般而言有两种方式:

  • xx.class.getResouce(name);
  • xx.class.getClassLoader().getResource(name);

class.getResource()

对于第一种,name以“/”是相对项目根路径(classes或是bin)的路径,不以“/”开头则是以xx.class的路径为相对路径的路径。

  • 示例
    @Test
    public void testGetResource() {
        URL path = TestResource.class.getResource("/");
        System.out.println(path);
        path = TestResource.class.getResource("");
        System.out.println(path);
    }
file:/A:/code/workspace_dev/elasticsearchDemo/bin/
file:/A:/code/workspace_dev/elasticsearchDemo/bin/com/test/

此方式需要注意class要使用自己定义的类,因为自定义的类所在路径是项目内的路径,才能得到根目录路径。

classLoader.getResource()

使用此方式要注意两个问题,一是classLoader是那个,另一个是此方法的name参数不支持“/”来指明根路径,默认就是根路径,因为它是基于classLoader。

有类加载机制的理论,jvm内建的三个classLoader(自顶向下):

  • BootStrapClassLoader
  • ExtClassLoader
  • AppClassLoader

BootStrapClassLoader实际上是非java实现的,在通过extClassLoader的getParent()来获取时,实际上得到的是null,BootStrapClassLoader加载jdk中的内建类,所以不要使用类似String.class.getClassLoader().getResource(),会报NPE异常,一定要使用自定义的类的加载器(也就是APPClassLoader)或者使用自定义的类加载器来调用getResource()方法。

  • 示例
@Test
    public void testGetResource() {
        System.out.println(TestLog4J2.class.getClassLoader());
        System.out.println(TestLog4J2.class.getClassLoader().getResource(""));
        System.out.println(TestLog4J2.class.getClassLoader().getResource("/"));
    }
sun.misc.Launcher$AppClassLoader@681a9515
file:/A:/code/workspace_dev/elasticsearchDemo/bin/
null

主要第三行返回null,因为不支持'/'开头的方式来获取根路径,默认就是项目的根路径,这个很好理解,因为类加载器的工作是加载ClassPath上的类的,是以根目录为基础的。

web工程的获取和普通java project不同,它的根路径是webcontent或者是webROOT目录,需要经过ServletContext来获取。

你可能感兴趣的:(class.getResource和getClassLoader().getResource)