我正在寻找一个自定义类加载器,它将从自定义网络加载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的jar文件,包含近2000个类,并且需要大约160毫秒来迭代所有条目,更不用说加载它找到的类了.
如果有人知道的解决方案比每次加载类时迭代JarInputStream的条目更快,请分享!