Class以及ClassLoader的getResource与getResourceAsStream

本文解析了Java中Class.getResource与ClassLoader.getResource的区别及联系。详细介绍了Class.getResource如何通过resolveName方法定位资源,并最终调用ClassLoader.getResource来获取资源。同时对比了两者在不同classpath设置下的资源查找范围。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Class.getResource与ClassLoader.getResourcce

  • Class.getResource最终也是调用ClassLoader.getResource,Class.getResource就多了一个resolveName
public java.net.URL getResource(String name) {
    name = resolveName(name);
    ClassLoader cl = getClassLoader0();
    if (cl==null) {
        // A system class.
        return ClassLoader.getSystemResource(name);
    }
    return cl.getResource(name);
}
private String resolveName(String name) {
    if (name == null) {
        return name;
    }
    if (!name.startsWith("/")) {
        Class<?> c = this;
        while (c.isArray()) {
            c = c.getComponentType();
        }
        String baseName = c.getName();
        int index = baseName.lastIndexOf('.');
        if (index != -1) {
            name = baseName.substring(0, index).replace('.', '/')
                +"/"+name;
        }
    } else {
        name = name.substring(1);
    }
    return name;
}
  • Class.getResourceAsStream最终也是调用ClassLoader.getResourceAsStream,Class.getResourceAsStream就多了一个resolveName。另外ClassLoader.getResourceAsStream会调用ClassLoader.getResource获取资源路径
public InputStream getResourceAsStream(String name) {
    name = resolveName(name);
    ClassLoader cl = getClassLoader0();
    if (cl==null) {
        // A system class.
        return ClassLoader.getSystemResourceAsStream(name);
    }
    return cl.getResourceAsStream(name);
}
public InputStream getResourceAsStream(String name) {
    URL url = getResource(name);
    try {
        return url != null ? url.openStream() : null;
    } catch (IOException e) {
        return null;
    }
}
  • 如果不考虑name以/开头的话,Class.getResource是在class文件相同的目录查找资源,ClassLoader.getResource是在所有的classpath下查找资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值