2016-09-05 5 views
1

DexClassLoaderは素晴らしいですが、コンパイル済みクラスを内部/外部ストレージからdex/jarファイルとしてロードすることによってのみ機能します。Android - クラスをメモリに動的にロードする

クラスに最初に何も書き込まずにクラスをメモリに直接ロードするにはどうすればよいですか?

私はJava-Runtime-Compiler(オンザフライでクラスをコンパイルするストーリー)を知っています。これは完璧ですが、アンドロイドでは機能しません。

答えて

0

ここでもJavaクラスローダーを作成する一般的な原則が適用されるので、基本的にはdefineClass()を呼び出すなどして、Classインスタンスを生成できるクラスローダーを作成する必要があります。もちろん、これにはデクスバイトコードの有効な配列を作成することも含まれます。私はまだそれをしていない、と非常に特別な機会の他に、私はとにかくそれをやろうとするのを控えるだろう。この道に従っている場合は、Java 5および6に含まれていたクラスローダー機能のみを使用してください。

0

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

関連する問題