我需要在Android中创建一个在运行时扩展抽象类的类。 我真正需要的是生成这样的东西:
Class A extends AbstractClass{
A(){
super("A name that is saved on AbstractClass");
fieldFromAbstractClass =...
}
@Override
public void aMethodFromAbstractClass(){
//some code....
}
}
我想在运行时生成此内容。这可能吗?
答案 0 :(得分:4)
在“传统”Java中,您可以在运行时创建和编译类,或使用字节代码生成器(如ASM)来扩充或生成类文件。
但是,您需要记住,Android 不是 Java虚拟机。创建APK时,类文件将转换为由Android的Dalvik虚拟机处理的专用字节码。
我不知道Dalvik特定的运行时字节码生成器,所以我不相信(目前)可以做你所描述的。
修改强>
有一个名为Dexmaker的库,可能会实现此目的。我是从this related answer发现的。
答案 1 :(得分:0)
您可以将A
设为匿名内部类。但是,您无法提供新的构造函数。对于您的示例,请在fieldFromAbstractClass
中定义AbstractClass
并提供getter和setter。
AbstractClass a = new AbstractClass() {
@Override
public void aMethodFromAbstractClass() {
// ...
}
}
a.setFieldFromAbstractClass( someValue );
// do something with A
如果声明为final,您还可以引用内部类中包含块的变量。有关更多信息,我建议您阅读一些Java教程或书籍。