jar中的类加载类

时间:2012-12-03 13:27:06

标签: 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 URL[] {jarUrl}, Thread.currentThread().getContextClassLoader());
        Class c = loader.loadClass(classToLoad); 
    } catch (Exception e) {
        e.printStackTrace();
    }

但是,我需要一种方法:

  • 我们不需要创建一个文件(因为我试图处理的jar是一个提取的字节数组[])
  • 或者我们不需要从byte []数组创建临时文件(因为AppEngine,我使用的平台不允许创建临时文件)

2 个答案:

答案 0 :(得分: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
     }
 }

答案 1 :(得分:0)

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