1

DexClassLoaderは優れていますが、コンパイルされたクラスを内部/外部ストレージから dex/jar ファイルとしてロードすることによってのみ機能します。

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

私はピーター・ローリーのJava-Runtime-Compiler (オンザフライで文字列をクラスにコンパイルする) を知っています。これは完璧ですが、Android では機能しません。

4

3 に答える 3

0

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

于 2017-07-16T16:39:41.937 に答える