8

学生クラスあり。

Class Student{
    String _name;
    ....
    ....

    public Student(){
    }
}

Student オブジェクトに動的属性を追加する可能性はありますか? 学生クラスを拡張せずに。

4

4 に答える 4

18

要するに、はい、実行時にバイトコードを変更することは可能ですが、非常に面倒であり、(ほとんどの場合) 必要なアプローチではありません。ただし、この方法を取る場合は、ASM などのバイト コード操作ライブラリをお勧めします。

より良いアプローチはMap<String, String>、「動的な」ゲッターとセッターには a を使用し、ゲッターでもセッターMap<String, Callable<Object>>でもないものには a を使用することです。それでも、なぜ動的クラスが必要なのかを再考することが最善の方法かもしれません。

public class Student {

    private Map<String, String> properties = new HashMap<String, String>();
    private Map<String, Callable<Object>> callables = new HashMap<String, Callable<Object>>();
    ....
    ....
    public String getProperty(String key) {
        return properties.get(key);
    }

    public void setProperty(String key, String value) {
        properties.put(key, value);
    }

    public Object call(String key) {
        Callable<Object> callable = callables.get(key);
        if (callable != null) {
            return callable.call();
        }
        return null;
    }

    public void define(String key, Callable<Object> callable) {
        callables.put(key, callable);
    }
}

注意として、Callable を使用して null を返すことにより、この概念で void メソッドを定義できます。

于 2012-10-11T05:24:48.267 に答える
8

あなたはバイトコード操作に入ることができますが、そのように狂気があります(特にコードを維持しなければならないプログラマーにとって)。

代わりに属性を格納しますMap<String,String>

于 2012-10-11T05:11:11.420 に答える
1

実行時にクラスに新しいメソッドとプロパティを挿入する

Javaを使うだけで可能ですか?

プロキシ オブジェクトの作成

于 2012-10-11T05:14:00.547 に答える
0

他の人が提案したトリッキーで複雑な方法でそれを行うことができますが..

しかし、いくつかの属性を確実に持つことができますdata structure(適切なものは になりますMap)..既存の属性を変更できるため、データ構造で行うことができます。それらにさらに属性を追加できます..これはより良いアプローチになります..

于 2012-10-11T05:11:17.337 に答える