-1

私は2つのクラスを持っていAますB. クラス A にはいくつかのフィールドがあり、そのうちの 1 つはArrayList<B>です。現在、B独自のフィールドがいくつかあります(それらのタイプとコンテンツは問題には関係ありません)

のフィールドを取得してその値を表示する方法は知っていますが、宣言されたから のAフィールドも取得できるようにする解決策を見つけることができませんでした。BArrayList<B>A

A基本的に、の内容を含めて、それぞれの内容を印刷しようとしていArrayList<B>ます。コンテンツとは、属性/フィールドのペアを意味します。

私は何も知らないと想定されてAおり、B---> 非常に一般的なものを書かなければなりません。前述の問題に到達するまで、リフレクションを使用して機能させることができました。

何か案は?

4

2 に答える 2

1

どうしたの:

final A a = new A();
for (final Field f : a.getClass().getDeclaredFields()) {
    f.setAccessible(true);
    System.out.println(f.get(a));
}

これにより、すべてのフィールドがループされA、コンテンツが出力されます。Listには優れたメソッドがあるため、B にメソッドがtoString必要なだけで、問題なく動作するはずです。toString

何らかの理由でそれができない場合は、再帰が機能します。ただし、どこかにB参照がないことがわかっていない限り、無限ループに陥ってしまうため、これは危険です。A

void printMethods(final Object input) {
    for (final Field f : input.getClass().getDeclaredFields()) {
        f.setAccessible(true);
        if (Collection.class.isAssignableFrom(f.getType())) {
            final Collection<?> c = (Collection<?>) f.get(input);
            for (final Object obj : c) {
                printMethods(obj);
            }
        } else {
            System.out.println(f.get(input));
        }
    }
}
于 2013-04-21T23:48:27.657 に答える
0

これは次のように簡単です。

"Bs: " + a.bList();

Bもオーバーライドする必要がありtoString()ます

于 2013-04-21T23:47:44.520 に答える