zoukankan      html  css  js  c++  java
  • class.getResource与classloader.getResource

    前言

    之前偶然看到一篇别人写的文章 https://www.cnblogs.com/drwong/p/5389631.html .对于怎么找到classpath下的资源,比如图片呀,视频呀什么的..勾起了我的一点好奇心.

    现在大家项目一般都是springboot的.那加载资源还是比较简单的..比如ClassPathResource呀..PathMatchingResourcePatternResolver呀(没有仔细确认,但是我印象中mybatis整合spring-boot的时候是用这个类去加载xml配置的)等等.

    但是原生的java方法.或者比如以前大学时代做gui的时候.没有spring.加载个图片可能用的最多的就是class.getResource或者classloader.getResource了.那么到底该用哪个方法? 资源开头是不是要加斜杠 / 呢? 这里我记录一下我的想法.

    class.getResource

    基本操作大概就是下面这样

     1 package test;
     2 
     3 public class ClassLoaderTest2 {
     4 
     5     public static void main(String[] args) throws ClassNotFoundException {
     6         ClassLoaderTest2.class.getResource("/"); // name = "" subString(1)
     7         ClassLoaderTest2.class.getResource(""); // name = "test/"  .会被替换成/
     8         // name = resolveName(name); ClassLoader.getResource
     9     }
    10 }

    class.getResource最终是会掉classLoader.getResource方法的.但是会对你传入的字符串进行一些处理

     在resolveName这一步中.

    如果你是传入的是/开头的字符串.那返回的name就是去掉/的内容.在我的例子里返回就是"",即空字符串.

    如果你传入的不是/开头的字符串.那他会把你的className中的.全部替换成/  比如我的class是test.ClassLoaderTest2 那就会变成 test/  所以我传入的""就变成了 "test/"

    可以参考我代码中的注释.

    classloader.getResource

    因为class.getResource最后也是调用了classloader.getResurce.所以最终怎么找资源还是得看你的classloader是怎么写的.是哪个classloader.

    所以就想那篇文章中写的.在main运行程序与在tomcat里运行程序会有不同的现象.

    因为在tomcat中运行的时候classloader是webappClassLoader.

    他会对你传入的name做处理.不管你是/开头还是不是/开头.都会去掉这个/然后拼接上/WEB-INF/classes/

    所以在tomcat下你写/开头还是不写/开头都是一样的.都是相对/WEB-INF/classes下的路径.

    但是如果不是tomcat的classloader,比如在main里运行.那classloader是AppClassLoader.里面最终会调用sun.misc.URLClassPath.findResource 没有源码..追不下去了.

    测试结果是写相对路径(没有/)的时候是相对于你的classes的例如/D:/work/idea/ws/test/target/classes/

    如果写绝对路径/开头.会直接找不到资源.

    小结

    小结一下.如果你是main里运行的程序.

    如果是class.getResource.那就写/开头然后跟上你的classes下的相对路径地址

    如果你是classloader.getResource.那就不要写/开头.然后跟上你的classes下的相对路径地址

  • 相关阅读:
    曲禮上第一
    Flink 侧输出流 SideOutput
    Flink ProcessFunction API自定义事件处理
    Kafka对接Flume
    Kafka 自定义拦截器
    Kafka 消费者API
    Kafka 生产者API
    luoguP2137 Gty的妹子树 分块+主席树+DFS序
    Codeforces Round #650 (Div. 3)
    LOJ#504. 「LibreOJ β Round」ZQC 的手办 线段树+堆
  • 原文地址:https://www.cnblogs.com/abcwt112/p/12242577.html
Copyright © 2011-2022 走看看