在Java Android中动态编辑/创建类

时间:2011-09-17 07:15:08

标签: java android reflection cglib bcel

我正在寻找一种在运行时动态定义类并在Android中实例化它们的方法。根据我的理解,这已经在Android中完成了,我只需要帮助解决它。

我可以在Javascript和PHP中获得类似的结果。我知道可以使用ASM,BCEL或CGlib之类的东西在Java中完成。但是,我不了解任何这些,以了解它们是否适用于Android。或者,他们会工作,有什么影响?

如果假设所有这三个都可以在Android中运行,那么有人可以指出我在哪里开始了解使用哪个以及如何使用它的正确方向?

我没有做过多少Java编程,而且我最近才在Android中使用它,所以,我很感激所有的帮助/纠正。话虽如此,如果你的答案不简单,我将不胜感激:不要这样做。我正在寻找如何具体做到这一点,而不是如何正确地做到这一点。至少,直到我的应用程序崩溃。 :)

我认为在以下情况下Android已经发生这种情况:(不是100%确定)

从JSON创建对象。 AIDL

3 个答案:

答案 0 :(得分:3)

不要这样做:)

我实际上怀疑有JSON库的行为方式;我所知道的两种接受方式(我不是这方面的专家)要么创建某种包含名称 - 值对的数据结构 - 即将数据添加到数据结构但不创建新类 - 或者准备模板将从JSON对象填充的类。

静态类型的Java不适合在运行时创建全新的类,并且没有反射支持 - 尽管支持访问未知类型的对象(例如查询所有字段/方法)。

可以做的是手动将java类写入文件 - 使用Java代码然后以某种方式编译它,或者直接在字节码中编译 - 然后加载该文件在运行时。这很难看,但它会起作用。然后它就像任何运行时加载类一样 - 要么你依赖加载类的基类/接口,要么你必须使用反射来做任何有意义的事情。

答案 1 :(得分:3)

对于那些真正想要这样做的人(例如使用Dalvik的JIT为另一种语言创建快速解释器),就有这个项目:

http://code.google.com/p/dexmaker/

允许您以编程方式创建类,变量和方法。

答案 2 :(得分:1)

Generating Dalvik Bytecode at Runtime on-device Using ASM or BCEL

此示例使用ASM和BCEL在设备上生成两个类。 这些类被创建到SD卡内存中,然后动态加载到Android操作系统中。

以下类是示例的模板:

public class HelloWorld {
    public static void hello(){
        int a=0xabcd;
        int b=0xaaaa;
        int c=a-b;
        String s=Integer.toHexString(c);
        System.out.println(s);
    }

}

首先,我使用BCEL或ASM在SD卡中创建一个新的ad-hoc类。 其次,我已经使用SD卡中的Dxclient utiliy将Java类转换为Dex类。 最后我创建了一个jar文件,然后我将这个软件包从SD卡加载到设备中

DXClient参考

https://github.com/headius/dexclient/blob/master/src/DexClient.java