将类动态加载到内存中

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

我怎样才能直接将类加载到内存中,而不必先写入任何内容?

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


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


正如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的字符串编译成字节码。 虽然我不知道这样做的任何方式,但我建议你看看这个:https://github.com/linkedin/dexmaker

链接地址: http://www.djcxy.com/p/62553.html

上一篇: dynamically load class into memory

下一篇: Class resolved by unexpected DEX;