当前位置: 首页 > 面试题库 >

创建一个ClassLoader以从字节数组加载JAR文件

夔高寒
2023-03-14
问题内容

我正在寻找编写一个自定义类加载器,它将JAR通过自定义网络加载文件。最后,我要做的只是JAR文件的字节数组。

我无法将字节数组转储到文件系统上并使用URLClassLoader
我的第一个计划是JarFile从流或字节数组创建对象,但它仅支持File对象。

我已经写了一些使用的东西JarInputStream

public class RemoteClassLoader extends ClassLoader {

    private final byte[] jarBytes;

    public RemoteClassLoader(byte[] jarBytes) {
        this.jarBytes = jarBytes;
    }

    @Override
    public Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
        Class<?> clazz = findLoadedClass(name);
        if (clazz == null) {
            try {
                InputStream in = getResourceAsStream(name.replace('.', '/') + ".class");
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                StreamUtils.writeTo(in, out);
                byte[] bytes = out.toByteArray();
                clazz = defineClass(name, bytes, 0, bytes.length);
                if (resolve) {
                    resolveClass(clazz);
                }
            } catch (Exception e) {
                clazz = super.loadClass(name, resolve);
            }
        }
        return clazz;
    }

    @Override
    public URL getResource(String name) {
        return null;
    }

    @Override
    public InputStream getResourceAsStream(String name) {
        try (JarInputStream jis = new JarInputStream(new ByteArrayInputStream(jarBytes))) {
            JarEntry entry;
            while ((entry = jis.getNextJarEntry()) != null) {
                if (entry.getName().equals(name)) {
                    return jis;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

这对于小型JAR文件可能很好用,但是我尝试加载2.7MB包含几乎所有2000类的jar文件,它160 ms只是为了遍历所有条目而已,更不用说加载找到的类了。

如果有人知道一个解决方案比JarInputStream每次加载类都遍历一个项更快的方法,请分享!


问题答案:

我将遍历该类一次并缓存条目。我还将查看URLClassLoader的源代码以了解其功能。如果失败,则将数据写入临时文件并通过普通的类加载器加载。



 类似资料:
  • 问题内容: 所以-我有一个需要a 作为输入的第三方库。我有一个。 我不想将字节写入磁盘..我想将其保留在内存中。我如何从提供的内容创建一个想法(无需写入磁盘)? 问题答案: 抱歉,不可能。除非您具有RAM磁盘,否则File本质上是磁盘上的实体-但这不是您可以用Java创建的东西。 这正是API不应该基于File对象(或过载以接受InputStream)的原因。

  • 我试图将一个类加载到字节数组中。MainC、Loader、ClassByte和byteClassLoader都是用来加载类的。 主C是起点。 这里我们加载类并调用方法。 在这里,我们可以获得要加载的类和字节数组。 包含字节的类加载器 下面是我想执行的类 Startclass的startmethod()是起点 和 但也有例外。 线程“main”java中的StartMethod 异常。朗。反思。在太

  • 问题内容: 我想创建一个jar文件来执行,该文件是使用java和clojure实现的。这是我采取的步骤。 使我的Java代码调用clojure代码 我可以生成一个具有clojure核心和我的clojure代码的jar文件(ThingOne-1.0.0-SNAPSHOT- standalone.jar),并且我还可以得到一个使用jar文件中使用clojure代码的类文件(HelloJava.clas

  • 问题内容: 这个问题困扰了我一段时间。我必须在我的Java应用程序中加载几个文件,到目前为止,我工作的唯一方式是这样的: 但这是丑陋和可怕的。有一阵子我以为我在做这个工作: 但这由于某种原因不再起作用(我必须做些更改并且没有注意到。它返回null。 我应该使用getResource()而不是getSystemResource()(如果这样),为什么getSystemResource()是静态的却不

  • 如何从JNI中JAR文件的字节数组加载所有类<我的代码 我需要读取JAR文件的字节,将它们转换成jbytes并从这些字节加载所有java类 比如java中的代码

  • 问题内容: 通过这种方式获得字节数组- 现在我如何从字节数组重建此灰度图像? 我对ARGB,RGB或灰度图像了解不多。我试过了- 当我绘制此图像时,它不是黑白的,而是橙色和灰色的东西。 问题答案: 如果我向您解释如何从ARGB / RGB 2灰度转换,希望对您有所帮助,因为它有太多未知的函数和类:P ARGB为32位/像素,因此每个通道为8位。Alpha通道是不透明度,因此与透明度相反,因此0是透