4

いくつかの拡張がある複雑なオブジェクト階層があります。

すべてのフィールドにデフォルト値を反射的に挿入できるライブラリを探しています。

例えば:

class Person {
    String name;
    Color color;
    List<Clothes> clothes;
}

class Child extends Person {
    Sibling sibling;
}

class Foo {
   Person person;
   Child child;
}

オブジェクト (この場合はFooクラス) をパラメーターとして取り、すべてのフィールドに既定値を反射的に挿入するライブラリが必要です (既定値を定義できればさらに優れています)。また、すべてのマップ、リスト、セットなどは新しいものを取得する必要があります

BeanUtilsを見てきましたが、私の知る限り、探しているものを正確にサポートしていません。

注: これらは単なる例であり、私のオブジェクトははるかに複雑で大きくなっています。それらには多くのオブジェクトがあり、各オブジェクトには多くのオブジェクトがあります。マップ、リストなどの両方。

BeanUtils や Google Guava などのいくつかのライブラリを組み合わせて、自分のものにする方が良いでしょうか?

4

2 に答える 2

3

構造が既に構築されていれば、1 つの方法で行うのはかなり簡単なはずです (構築時にそれらを設定する方がより論理的なアプローチである場合)。

デフォルト値が事前にわかっている場合は、それらをクラスに設定してみませんか? (つまり、デフォルト、デフォルト値;)

個人のデフォルト名 (null 以外) を設定することには多くの価値がありますか? デフォルト値を動的に指定する場所の例を挙げていただけますか?

于 2011-09-15T07:37:22.337 に答える
0

個人的には、通常のJavaコンストラクター、および/またはゲッターとセッターなどを使用しようとしますが、質問から、クラスの正確な構造を知らなくても機能するものが必要だと思います。

したがって、本当にこれを行う必要がある場合は、おそらく次の行に沿って何かを行うことができます。

public void setFields(Object myObject) {
    Class<?> clazz = myObject.getClass();
    Field[] fields = clazz.getFields();
    for(Field field : fields) {
        String name = field.getName();
        if(name.equals("person")) {
            field.set(myObject, new Person());
        } else if (name.equals("color")) {
             // etc...
        }
    }

}
于 2011-09-15T07:39:13.890 に答える