【问题标题】:Loading from JAR as an InputStream?从 JAR 作为 InputStream 加载?
【发布时间】:2011-02-06 12:44:52
【问题描述】:

是否有可以用来从 InputStream 加载类的 ClassLoader 实现?

我正在尝试将我有 InputStream 的 JAR 加载到新的 ClassLoader 中。

【问题讨论】:

    标签: java jar classloader inputstream


    【解决方案1】:

    这不太可能,如果您尝试自己做,您会发现。您将无法随机访问 InputStream 以在请求类时查找类,因此您必须将内容缓存在内存或文件系统中。

    如果您缓存在磁盘上,只需使用URLClassLoader

    如果您在内存中缓存,则需要使用JarInputStream 创建某种Map,然后扩展ClassLoader(覆盖适当的方法)。这种方法的缺点是不必要地将数据保存在 RAM 中。

    【讨论】:

      【解决方案2】:

      我知道这并不是您关于 JAR/InputStream 问题的真正答案。 但是以下可能是您尝试实现的目标的替代解决方案。 这是一些将 URL 添加到类路径的代码。

      您可以将java.io.File 转换为URLf.toURI().toURL()

      /**
       * Adds a URL to current classpath.
       * @param url url
       */
      public static void addURL(URL u) {      
          URLClassLoader sysloader = (URLClassLoader)ClassLoader.getSystemClassLoader();
          try {
              Method method = URLClassLoader.class.getDeclaredMethod("addURL",parameters);
              method.setAccessible(true);
              method.invoke(sysloader,new Object[]{u});
              System.out.println("Dynamically added " + u.toString() + " to classLoader");
          } 
          catch (Exception e) {
              e.printStackTrace();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2012-12-06
        • 1970-01-01
        • 2017-03-05
        • 2012-12-21
        • 2013-07-18
        • 2012-02-13
        • 2017-01-23
        • 2011-05-06
        • 1970-01-01
        相关资源
        最近更新 更多