3

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

我可以在 Javascript 和 PHP 中得到类似的结果。我知道它可以在 Java 中使用 ASM、BCEL 或 CGlib 之类的东西来完成。但是,我对其中任何一个都不够了解,无法了解它们是否可以在 Android 上运行。或者,它们会起作用,有什么影响?

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

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

我相信这已经在 Android 中发生在以下情况下:(不是 100% 肯定)

从 JSON 创建一个对象。AIDL

4

3 回答 3

3

不要这样做:)

我实际上怀疑是否存在这种行为的 JSON 库。我知道的两种公认的方式(虽然我不是这方面的专家)要么创建某种包含名称-值对的数据结构 - 即将内容添加到数据结构但不创建新类 - 要么准备模板将从 JSON 对象填充的类。

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

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

于 2011-09-17T08:20:16.413 回答
3

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

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

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

于 2012-02-17T09:46:49.257 回答
1

使用 ASM 或 BCEL 在设备上运行时生成 Dalvik 字节码

此示例使用 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 实用程序将 Java 类转换为 Dex 类。最后我创建了一个 jar 文件,然后我将这个包从 SD 卡加载到设备中

DXClient 参考

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

于 2012-03-01T11:47:17.263 回答