简体   繁体   English

在 Android 中在运行时创建一个类

[英]Creating a class in runtime in Android

I need to create a class that extends an abstract class in runtime in Android.我需要创建一个在 Android 运行时扩展抽象类的类。 What I really need is to generate something like this:我真正需要的是生成这样的东西:

Class A extends AbstractClass{

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

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

I want to generate this at runtime .我想在运行时生成这个。 Is this possible?这可能吗?

In "traditional" Java, you can create and compile classes at runtime, or use byte code generators such as ASM to augment or generate class files.在“传统”Java 中,您可以在运行时创建和编译类,或者使用字节码生成器(例如 ASM)来扩充或生成类文件。

However, you need to keep in mind that Android is not a Java virtual machine.但是,您需要记住,Android不是Java 虚拟机。 When you create an APK, class files are converted into specialized bytecode that is processed by Android's Dalvik virtual machine.当您创建 APK 时,类文件会被转换为由 Android 的 Dalvik 虚拟机处理的专用字节码。

I'm not aware of Dalvik-specific runtime bytecode generators, so I don't believe that it is (currently) possible to do what you described. 我不知道特定于 Dalvik 的运行时字节码生成器,所以我不相信(目前)可以执行您所描述的操作。

EDIT编辑

There is a library called Dexmaker , which might accomplish this.有一个名为Dexmaker的库,可以实现这一点。 I discovered it from this related answer .我从这个相关的答案中发现了它。

You can make A an anonymous inner class.您可以使A成为匿名内部类。 However, you cannot provide a new constructor.但是,您不能提供新的构造函数。 For your example define fieldFromAbstractClass in AbstractClass and provide a getter and a setter.对于您的示例,在AbstractClass定义fieldFromAbstractClass并提供一个 getter 和一个 setter。

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

You can also reference variables from the containing block in the inner class if the are declared final.如果声明为 final,您还可以从内部类中的包含块中引用变量。 For more information I recommend to read some Java tutorial or book.有关更多信息,我建议阅读一些 Java 教程或书籍。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM