//方法1
URL url1 = ClassLoader.getSystemResource(“business.properties”);
System.out.println(“url1:\t” + (url1 == null ? “null” : url1.getPath()));
URL url1withSlash = ClassLoader.getSystemResource("/business.properties");
System.out.println(“url1/:\t” + (url1withSlash == null ? “null” : url1withSlash.getPath()));
方法1:使用的是jvm的ClassLoader, 如果是直接运行的Java程序, 那么的确是调用jvm的ClassLoader, 于是调用的程序的根目录是可以获取这个文件的. 而在tomcat中,这个类并不是由系统自带的ClassLoader装载的, tomcat中而是由一个叫WebappClassLoader来装载的, jvm的ClassLoader取到的这文件是null
//方法2
ClassLoader classLoader2 = test.class.getClassLoader();
URL url2 = classLoader2.getResource(“business.properties”);
System.out.println(“url2:\t” + (url2 == null ? “null” : url2.getPath()) + “;classLoader is:” + classLoader2.toString());
URL url2withSlash = classLoader2.getResource("/business.properties");
System.out.println(“url2/:\t” + (url2withSlash == null ? “null” : url2withSlash.getPath()));
方法2: 获取加载当前类的ClassLoader, 这个ClassLoader会随着环境的变化而变化, 可以看到第一次直接运行的ClassLoader是jvm自带的classLoader is:sun.misc.Launcher$AppClassLoader@7d05e560, 而在tomcat中是WebappClassLoader,它的父级是java.net.URLClassLoader@1ae8873a, 都能获取到properties文件
//方法3
URL url3 = test.class.getResource(“business.properties”);
System.out.println(“url3:\t” + (url3 == null ? “null” : url3.getPath()));
URL url3withSlash = test.class.getResource("/business.properties");
System.out.println(“url3/:\t” + (url3withSlash == null ? “null” : url3withSlash.getPath()));
方法3:直接从当前对象的类调用getResource方法, 刚进去就调用了resolveName方法, 这个resolveName方法,判断文件路径是以/ 开头还是./开头, 来确定是相对与当前class文件目录还是相对于程序根目录, 然后也会像方法2那样获取加载当前类的ClassLoader, 如果获取不到则使用系统自带的ClassLoader… 这个方法比较智能,可以使用,但是跟其他方法相比, 需要加一个 /表示程序根目录.
//方法4
ClassLoader classLoader4 = Thread.currentThread().getContextClassLoader();
URL url4 = classLoader4.getResource(“business.properties”);
System.out.println(“url4:\t” + (url4 == null ? “null” : url4.getPath()) + “;classLoader is:” + classLoader4.toString());
URL url4withSlash = classLoader4.getResource("/business.properties");
System.out.println(“url4/:\t” + (url4withSlash == null ? “null” : url4withSlash.getPath()));
方法4: 获取加载当前线程的ClassLoader,当前类是在当前线程调用的,则他们的ClassLoader对象是一样的, 可以看他们输出的ClassLoader的内存地址是一样的.