1

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

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

我知道 Peter Lawrey 的Java-Runtime-Compiler(即时编译字符串到类),这将是完美的,但它在 android 中不起作用。

4

3 回答 3

0

您可以通过InMemoryDe​​xClassLoader来完成

于 2021-10-05T13:30:21.847 回答
0

正如 Thomas 所说,您可以反射性地调用defineClass()您希望将类加载到其中的 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 回答
0

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

于 2016-09-05T11:13:23.730 回答