在Android中运行时创建类

4
我需要在Android中创建一个扩展抽象类的类。 我实际需要生成如下内容:
Class A extends AbstractClass{

    A(){
         super("A name that is saved on AbstractClass");
         fieldFromAbstractClass =...
    }

    @Override
    public void aMethodFromAbstractClass(){
       //some code....
    }
}

我想在运行时生成这个。这可行吗?

https://dev59.com/nEjSa4cB1Zd3GeqPCA7t - Kazekage Gaara
我很困惑,不知道什么会阻止你这样做。 - OmniOwl
@KazekageGaara 它在安卓上能用吗?我也看到一些似乎在Java中可用的库,但我不知道它们是否在安卓上可用... 另外,通常这些库的文档很差 :/ - Tiago Almeida
2个回答

5
在“传统”的Java中,您可以在运行时创建和编译类,或使用字节码生成器(如ASM)来增强或生成类文件。但是,请记住Android不是Java虚拟机。当您创建APK时,类文件会被转换为专用的字节码,由Android的Dalvik虚拟机处理。我不知道Dalvik特定的运行时字节码生成器,所以我不认为目前有可能做到您所描述的事情。
编辑:有一个名为Dexmaker的库,可能可以实现这一点。我从这个相关答案中发现了它。

这正是我担心的。那么@Kazekage Gaara提供的方法行不通,对吗? - Tiago Almeida
它适用于普通的Java,但我怀疑它在Android上运行不了。虽然我不是100%确定,但我很想听听其中一位大师的意见。 - Tony the Pony
这似乎不容易做到,我也不想浪费时间尝试,然后发现它是无法完成的。我们如何称呼那些大师们? - Tiago Almeida
明天我会发布一个单独的问题,因为我很想了解更多。但是你在你的应用程序中究竟想做什么? - Tony the Pony
没有什么区别... 我本来打算发布一个更一般性的问题,但是经过一些研究,我发现了一个有趣的工具叫做Dexmaker(见编辑部分)。 - Tony the Pony
显示剩余3条评论

0

你可以将A定义为匿名内部类。但是,你不能提供新的构造函数。对于你的例子,在AbstractClass中定义fieldFromAbstractClass并提供一个getter和setter。

    AbstractClass a = new AbstractClass() {
        @Override
        public void aMethodFromAbstractClass() {
           // ...
        }
    }
    a.setFieldFromAbstractClass( someValue );
// do something with A

如果在内部类中声明为final,则可以从包含块引用变量。如需更多信息,建议阅读一些Java教程或书籍。


我相信OP想要在运行时生成这个类。 - Tony the Pony
@TonythePony是正确的。我想在运行时生成一个继承AbstractClass的类。 - Tiago Almeida

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接