0

这是动态加载类的常用方法:

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,我使用的平台不允许创建临时文件)
4

2 回答 2

1

您将必须创建自己的类加载器。

像这样,伪代码中的基本思想:

 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
     }
 }
于 2012-12-03T13:55:21.767 回答
0

编写您自己的ClassLoader并覆盖findClass(). 在那里你可以defineClass()用来加载你的byte[].

于 2012-12-03T13:51:38.570 回答