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
     }
 }