我正在寻找一个自定义类加载器,它将JAR
通过自定义网络加载文件。最后,我需要处理的只是JAR
文件的字节数组。
我无法将字节数组转储到文件系统并使用URLClassLoader
.
我的第一个计划是从流或字节数组创建一个JarFile
对象,但它只支持一个File
对象。
我已经写了一些使用 a 的东西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
如果有人知道每次加载类时都比遍历 a 的条目更快的解决方案,请分享!