3

Android で実行時に抽象クラスを拡張するクラスを作成する必要があります。私が本当に必要としているのは、次のようなものを生成することです。

Class A extends AbstractClass{

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

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

これを実行時に生成したい。これは可能ですか?

4

2 に答える 2

4

「従来の」Javaでは、実行時にクラスを作成してコンパイルしたり、ASMなどのバイトコードジェネレーターを使用してクラスファイルを拡張または生成したりできます。

ただし、AndroidはJava仮想マシンではないことに注意する必要があります。APKを作成すると、クラスファイルはAndroidのDalvik仮想マシンによって処理される特殊なバイトコードに変換されます。

私はDalvik固有のランタイムバイトコードジェネレーターを知らないので、あなたが説明したことを(現在)実行できるとは思いません。

編集

これを実現する可能性のあるDexmakerというライブラリがあります。私はこの関連する答えからそれを発見しました。

于 2012-05-20T16:35:59.697 に答える
0

A匿名の内部クラスを作成できます。ただし、新しいコンストラクターを提供することはできません。あなたの例では、ゲッターとセッターを定義fieldFromAbstractClassして提供します。AbstractClass

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

がfinalとして宣言されている場合は、内部クラスの包含ブロックから変数を参照することもできます。詳細については、Javaのチュートリアルまたは本を読むことをお勧めします。

于 2012-05-20T16:35:43.440 に答える