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 に答える