Class和ClassLoader的getResource方法不同之处
下文笔者讲述Class和ClassLoader类的getResource方法来加载资源文件的不同之处,如下所示
java访问资源的方式
Class的getResource方法; ClassLoader的getResource方法; ClassLoader的getResources方法; //获取批量资源 ClassLoader的getSystemResource; //静态方法
Class获取方法
使用引用类的class属性即可获取
ClassLoader的获取方法
1.调用Class的getClassLoader方法 如:getClass().getClassLoader() 2.当前线程获取ClassLoader Thread.currentThread().getContextClassLoader() 3.获取系统ClassLoader: ClassLoader.getSystemClassLoader()
Class.getResource 与 ClassLoader.getResource 的区别
public class ClassLoaderAndClassContrast { public static void main(String[] args) throws Exception { Class<ClassLoaderAndClassContrast> aClass = ClassLoaderAndClassContrast.class; ClassLoader classLoader = aClass.getClassLoader(); URL resource = classLoader.getResource("cookies.properties"); URL resource1 = aClass.getResource("dir/cookies.properties"); if(resource!=null){ byte[] bytes = FileCopyUtils.copyToByteArray(resource.openStream()); System.out.println(new String(bytes)); } } }
Class和ClassLoader的getResource方法的区别
ClassLoader不关心当前类的包名路径 以classpath为基点来定位资源 注意事项: 使用ClassLoader加载资源时,路径不要以"/"开头,所有以"/"开头的路径都返回null Class.getResource如果资源名是绝对路径(以"/"开头) 会以classpath为基准路径去加载资源 如果不以"/"开头,那么以这个类的Class文件所在的路径为基准路径去加载资源
实际开发中,笔者建议使用Class.getResource方法获取资源例:
public class ClassLoaderAndClassContrast { Class<ClassLoaderAndClassContrast> cls = ClassLoaderAndClassContrast.class; ClassLoader ldr = cls.getClassLoader(); public static void println(Object s) { System.out.println(s); } void showResource(String name) { println("## Test resource for: “" + name + "” ##"); println(String.format("ClassLoader#getResource(\"%s\")=%s", name, ldr.getResource(name))); println(String.format("Class#getResource(\"%s\")=%s", name, cls.getResource(name))); } public final void testForResource() throws Exception { showResource(""); //对于Class来,返回这个类所在的路径 showResource("/"); showResource(cls.getSimpleName() + ".class"); String n = cls.getName().replace('.', '/') + ".class"; showResource(n); showResource("/" + n); showResource("java/lang/Object.class"); showResource("/java/lang/Object.class"); } public static void main(String[] args) throws Exception { println("java.class.path: " + System.getProperty("java.class.path")); println("user.dir: " + System.getProperty("user.dir")); println(""); ClassLoaderAndClassContrast t = new ClassLoaderAndClassContrast(); t.testForResource(); } }例2:ClassLoader获取资源
ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); Enumeration<URL> resources = classLoader.getResources("META-INF/MANIFEST.MF");
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。