Class和ClassLoader的getResource方法不同之处

戚薇 Java经验 发布时间:2022-06-23 15:42:29 阅读数:6188 1
下文笔者讲述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");
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202206/16559702033816.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者