DexClassLoaderは優れていますが、コンパイルされたクラスを内部/外部ストレージから dex/jar ファイルとしてロードすることによってのみ機能します。
最初にカードに何も書き込まずに、クラスをメモリに直接ロードするにはどうすればよいですか?
私はピーター・ローリーのJava-Runtime-Compiler (オンザフライで文字列をクラスにコンパイルする) を知っています。これは完璧ですが、Android では機能しません。
DexClassLoaderは優れていますが、コンパイルされたクラスを内部/外部ストレージから dex/jar ファイルとしてロードすることによってのみ機能します。
最初にカードに何も書き込まずに、クラスをメモリに直接ロードするにはどうすればよいですか?
私はピーター・ローリーのJava-Runtime-Compiler (オンザフライで文字列をクラスにコンパイルする) を知っています。これは完璧ですが、Android では機能しません。
defineClass()
Thomas が述べたように、クラスをロードしたい ClassLoaderの保護されたメソッドを反射的に呼び出すことができます。
これを実現する方法の例を次に示します。
public static Class<?> loadClass(byte[] code, ClassLoader loadInto) throws InvocationTargetException
{
try {
Method m = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class);
m.setAccessible(true); // Make sure we can invoke the method
return (Class<?>) m.invoke(loadInto, code, 0, code.length);
}
// An exception should only be thrown if the bytecode is invalid
// or a class with the same name is already loaded
catch (NoSuchMethodException e) { throw new RuntimeException(e); }
catch (IllegalAccessException e){ throw new RuntimeException(e); }
}
ただし、あなたが言及していると感じているのは、含まれているリンクに基づいて、有効なJavaを含む文字列をバイトコードにランタイムコンパイルすることです。これを行う方法はわかりませんが、これを確認することをお勧めします: https://github.com/linkedin/dexmaker