2

ユーザーが Bean を選択し、そのフィールドを編集し、作成された Bean のインスタンスをキューに追加できる Java を使用して GUI を作成したいと考えています。私の質問は、フィールドへのアクセスに関するものです。MyParentObject から継承するクラス MyCompositeObject があります。MyParentObject は複数の Bean で構成され、それぞれがより多くの Bean で構成されています。クラス MyCompositeObject も Bean で構成されています。MyCompositeObject からアクセス可能なすべてのフィールドを検索したいと考えています。

Class MyParentObject
{
    MyObjectOne fieldOne;
    MyObjectTwo fieldTwo;
    String name;
  ...
 }

 Class MyCompositeObject extends MyParentObject
 {
    MyObjectThree fieldThree;
    Integer number;
   ...
 }

 Class MyObjectThree
 {
     boolean aBoolean;
     MyObjectFour fieldFour;
   ...
 }

BeanUtils API を使用しようとしましたが、すべてのメンバー Bean のフィールドを取得しようとして行き詰まりました。私が想像しているのは、MyCompositeObject のインスタンスからアクセスできるすべてのフィールドの深さ優先検索です。たとえば、これにはフィールド MyCompositeObject.fieldOne、MyCompositeObject.number、MyCompositeObject.fieldThree.aBoolean が含まれますが、これらに限定されません。

私が試したときに気づきました:

Fields[] allFields = BeanUtils.getFields(myCompositeObject);

私が頭の上にいたこと。私の研究では、これまでのところ、私が説明したことを実行できる事前構築済みの方法は見つかっていません。これを行うことができる API メソッドを教えてください。または、自分で作成する方法を教えてください。ありがとう。

4

1 に答える 1

3

それは一種の苦痛ですが、あなたは二次元で行かなければなりません

yourBeanClass.getSuperclass(); (and recursively get all superclasses until Object)

そして、あなたはそれぞれのフィールドを取得することができます

eachClass.getDeclaredFields() NOT getFields so you can get all the private fields

各フィールドができたら

field.getType() which returns the Class of that field

そしてもちろん、スーパークラスのフィールドを含むクラスのすべてのフィールドを確実に取得するために、その人物のスーパークラスチェーンをもう一度上る必要があります。

そのフィールドのクラスのチェーンができたら、上記を繰り返すことでそのフィールドを取得できます....はい、jdkはこれを楽しくしました!!!! 彼らがgetAllDeclaredFieldsメソッドを持っていたので、スーパークラスの階層を上る必要はありませんでした。

重要:それがプライベートフィールドであるときに読み取りと書き込みができるように、field.setAccessible(true)を呼び出す必要があります!!!

これは、スーパークラスを含むクラスのすべてのフィールドを取得するコードです。

private static List<Field> findAllFields(Class<?> metaClass) {
    List<Field[]> fields = new ArrayList<Field[]>();
    findFields(metaClass, fields);

    List<Field> allFields = new ArrayList<Field>();
    for(Field[] f : fields) {
        List<Field> asList = Arrays.asList(f);
        allFields.addAll(asList);
    }
    return allFields;
}

private static void findFields(Class metaClass2, List<Field[]> fields) {
    Class next = metaClass2;
    while(true) {
        Field[] f = next.getDeclaredFields();
        fields.add(f);
        next = next.getSuperclass();
        if(next.equals(Object.class))
            return;
    }
}

後で、ディーン

于 2012-09-30T22:26:39.060 に答える