DexClassLoaderは素晴らしいですが、コンパイル済みクラスを内部/外部ストレージからdex/jarファイルとしてロードすることによってのみ機能します。Android - クラスをメモリに動的にロードする
クラスに最初に何も書き込まずにクラスをメモリに直接ロードするにはどうすればよいですか?
私はJava-Runtime-Compiler(オンザフライでクラスをコンパイルするストーリー)を知っています。これは完璧ですが、アンドロイドでは機能しません。
DexClassLoaderは素晴らしいですが、コンパイル済みクラスを内部/外部ストレージからdex/jarファイルとしてロードすることによってのみ機能します。Android - クラスをメモリに動的にロードする
クラスに最初に何も書き込まずにクラスをメモリに直接ロードするにはどうすればよいですか?
私はJava-Runtime-Compiler(オンザフライでクラスをコンパイルするストーリー)を知っています。これは完璧ですが、アンドロイドでは機能しません。
ここでもJavaクラスローダーを作成する一般的な原則が適用されるので、基本的にはdefineClass()
を呼び出すなどして、Class
インスタンスを生成できるクラスローダーを作成する必要があります。もちろん、これにはデクスバイトコードの有効な配列を作成することも含まれます。私はまだそれをしていない、と非常に特別な機会の他に、私はとにかくそれをやろうとするのを控えるだろう。この道に従っている場合は、Java 5および6に含まれていたクラスローダー機能のみを使用してください。
Thomasが述べたように、クラスをロードするClassLoaderの保護されたdefineClass()
メソッドを反射的に呼び出すことができます。ここで
は、これを達成することができる方法の例です:
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を含むStringのランタイムのコンパイルである、が、あなたが含むリンク。これを行う方法はわかりませんが、これを見てみることをお勧めします:https://github.com/linkedin/dexmaker