2011-09-17 27 views
1

我正在寻找一种在运行时动态定义类并在Android中实例化它们的方法。根据我的理解,这已经在Android中完成了,我只需要一些帮助就可以搞清楚。在Java中动态编辑/创建类Android

我可以在JavaScript和PHP类似的结果。我知道它可以使用类似ASM,BCEL或CGlib的Java来完成。但是,我不太了解这些内容,以了解它们是否可以在Android上使用。或者,他们会工作,有什么影响?

如果假设所有三者都可以在Android上使用,有人能指出我正确的方向,从哪里开始了解使用哪个以及如何使用它?我还没有做过太多的Java编程,而且我最近才刚刚在Android上使用它,所以,我非常感谢所有可以获得的帮助/更正。有了这个说法,如果你的答案不是简单的,我将不胜感激:不要这样做。我正在寻找如何做到这一点,而不是如何做到这一点。至少,直到我的应用程序崩溃。 :)

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

创建从JSON对象。 AIDL

回答

3

不这样做:)

其实我怀疑有一些这样的行为,JSON库;但我所知道的两种可接受的方式(我不是这方面的专家)要么创建一些包含名称 - 值对的数据结构 - 即向数据结构中添加东西但不创建新类 - 或准备模板一个将从JSON对象中填充的类。 Java是静态类型的,它不适合在运行时创建全新的类,并且没有反射支持 - 虽然支持访问未知类型的对象(例如查询所有类的对象字段/方法)。

什么你可以做的是手动编写一个Java类文件 - 无论是在Java代码,然后以某种方式编译它,或直接在字节码 - 再加载该文件在运行时。这很丑陋,但它会起作用。然后,它就像任何运行时加载的类一样 - 要么依赖于加载类的基类/接口,要么必须使用反射对它进行任何有意义的操作。

+1

谢谢,我最终抛弃的想法和编程到语言有点起初,我比他愿意的还要多。看到解决方案,我认为让编译器完成工作更好,而我也是这样做的。 – Jonathan

3

对于那些谁真正想(使用的Dalvik的JIT创建其他语言的快速翻译为例)要做到这一点,有这样的项目:

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

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

1

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

此示例使用ASM和BCEL到generete设备上的两个类。 将这些类创建到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功能转换为Dex Class。 最后,我创建了一个jar文件,然后我已加载这个包到设备,从SD卡

DXClient参考

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