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");
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


