我正在寻找编写一个自定义类加载器,它将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是透