Android - 动态加载类到内存中

时间:2016-09-05 10:50:56

标签: java android reflection dexclassloader

DexClassLoader很棒,但只能通过从内部/外部存储加载已编译的类作为dex / jar文件来工作。

如何直接将类加载到内存中,而无需先向卡中写入任何内容?

我知道Peter Lawrey的Java-Runtime-Compiler(在飞行中编译String to Class),这将是完美的,但它在android中不起作用。

2 个答案:

答案 0 :(得分:0)

编写Java类加载器的一般原则也适用于此,所以基本上你需要做的是编写一个可以生成Class实例的类加载器,例如通过调用defineClass()。当然,这涉及创建一个有效的dex字节码数组。我还没有这样做,除了非常特殊的场合,无论如何我都会反复尝试这样做。如果您遵循这条道路,请记住仅使用Java 5和6中已存在的类加载器功能。

答案 1 :(得分:0)

正如托马斯所说,你可以反思性地调用你想要加载你的类的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的字符串的运行时编译成字节码。虽然我不知道这样做的任何方法,但我建议你看看这个:https://github.com/linkedin/dexmaker