【问题标题】:Dynamically editing/creating classes in Java Android在 Java Android 中动态编辑/创建类
【发布时间】:2012-03-01 19:47:17
【问题描述】:

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

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

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

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

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

从 JSON 创建一个对象。 人工智能

【问题讨论】:

    标签: java android reflection cglib bcel


    【解决方案1】:

    不要这样做:)

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

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

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

    【讨论】:

    • 谢谢,我最终放弃了这个想法并在语言中编程,这比我最初愿意做的要多一些。看到解决方案,我认为我最好让编译器完成它的工作,而我做我的。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      DXClient 参考

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-19
        • 2011-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-05
        • 2016-10-24
        • 2014-01-17
        相关资源
        最近更新 更多