将类动态加载到内存中
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