DexClassLoader很棒,但只能通过从内部/外部存储加载编译的类作为 dex/jar 文件来工作。
如何将类直接加载到内存中,而无需先将任何内容写入卡?
我知道 Peter Lawrey 的Java-Runtime-Compiler(即时编译字符串到类),这将是完美的,但它在 android 中不起作用。
DexClassLoader很棒,但只能通过从内部/外部存储加载编译的类作为 dex/jar 文件来工作。
如何将类直接加载到内存中,而无需先将任何内容写入卡?
我知道 Peter Lawrey 的Java-Runtime-Compiler(即时编译字符串到类),这将是完美的,但它在 android 中不起作用。
正如 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
编写 Java 类加载器的一般原则也适用于这里,所以基本上你需要做的是编写一个可以生成Class
实例的类加载器,例如通过调用defineClass()
. 当然,这涉及到创建一个有效的 dex 字节码数组。我还没有这样做,除了非常特殊的场合,我无论如何都不会尝试这样做。如果您遵循这条道路,请记住仅使用 Java 5 和 6 中存在的类加载器功能。