【问题标题】:Class.getResource and ClassLoader.getSystemResource: is there a reason to prefer one to another?Class.getResource 和 ClassLoader.getSystemResource:是否有理由偏爱一个?
【发布时间】:2011-06-09 19:49:09
【问题描述】:

我看到Class.getResourceClassLoader.getSystemResource 都用于在Java 中定位资源。有什么理由比另一个更喜欢一个吗?

【问题讨论】:

    标签: java resources


    【解决方案1】:

    加载资源有多种方式,每一种的含义略有不同——

    ClassLoader::getSystemResource() 使用系统类加载器。这使用用于启动程序的类路径。如果你在一个 web 容器中,比如 tomcat,这不会从你的 WAR 文件中获取资源。

    Class<T>#getResource() 将类的包名添加到资源名中,然后委托给它的类加载器。如果您的资源存储在反映您的类的包层次结构中,请使用此方法。

    ClassLoader#getResource() 委托给它的父类加载器。这最终会一直搜索到系统类加载器的资源。

    如果你有困惑,请坚持ClassLoader#getResource()

    【讨论】:

      【解决方案2】:

      来自Class.getResource( )

      此方法将调用委托给它的 类加载器,在制作完这些之后 更改资源名称:如果 资源名称以“/”开头,它是 不变;否则,包名 附加到资源名称 转换“。”后到 ”/”。如果这 对象由引导程序加载 loader,调用委托给 ClassLoader.getSystemResource

      ClassLoader.getSystemResource( )

      查找指定名称的资源 从用于加载的搜索路径 类。该方法定位 通过系统类资源 装载机

      【讨论】:

      • 一个好的答案将包括有关如何发现可以找到资源的位置的信息
      【解决方案3】:

      ClassLoader.getSystemResource() 将使用引导(系统)类加载器。

      Class.getResource() 将使用Class 的类加载器的特定实例,换句话说,无论使用什么类加载器来加载该类。这可能是与系统类加载器不同的类加载器。

      【讨论】:

        【解决方案4】:

        java.lang.Class的使用方法:

        public java.net.URL getResource(String name) {
          name = resolveName(name);
          ClassLoader cl = getClassLoader();
          if (cl==null) {
            return ClassLoader.getSystemResource(name);  // A system class.
          }
          return cl.getResource(name);
        }
        

        【讨论】:

          猜你喜欢
          • 2011-11-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-13
          • 1970-01-01
          • 2016-11-15
          • 2020-09-21
          • 2011-01-01
          相关资源
          最近更新 更多