Java 类从jar加载类
这是动态加载类的常用方法:Java 类从jar加载类,java,Java,这是动态加载类的常用方法: try { File file = new File(JAR_FILE); String classToLoad = "com.mycompany.MyClass"; URL jarUrl = new URL("jar", "","file:" + file.getAbsolutePath()+"!/"); URLClassLoader loader = new URLClassLoader(new UR
try {
File file = new File(JAR_FILE);
String classToLoad = "com.mycompany.MyClass";
URL jarUrl = new URL("jar", "","file:" + file.getAbsolutePath()+"!/");
URLClassLoader loader = new URLClassLoader(new URL[] {jarUrl}, Thread.currentThread().getContextClassLoader());
Class c = loader.loadClass(classToLoad);
} catch (Exception e) {
e.printStackTrace();
}
但是,我需要一种方法,其中:
- 我们不需要创建文件(因为我试图处理的jar在获取时是一个字节数组[])
- 或者,我们不需要从byte[]数组创建临时文件(作为AppEngine,我使用的平台不允许创建临时文件)
ClassLoader
并重写findClass()
。在那里,您可以使用defineClass()
加载您的字节[]
您必须创建自己的类加载器。类似这样,伪代码的基本思想:
class MyClassLoader extends ClassLoader {
public Class findClass(String name) {
byte[] b = loadClassData(name);
return defineClass(name, b, 0, b.length);
}
private byte[] loadClassData(String name) {
JarInputStream jis = new JarInputStream(new ByteArrayInputStream(bytearrayJarData));
JarEntry entry = jis.getNextJarEntry();
while (entry != null) {
//compare entry to requested class
// if match, return Byte data
// else entry = jis.getNextJarEntry();
}
return null; // nothing found
}
}