2016-12-23 8 views
5

私は自分のプロジェクトに継承したBeanクラスを使用しています。ここでいくつかのスーパークラスは空になり、サブクラスはフィールドを持つことができる&サブクラスのいくつかは空になり、スーパークラスはフィールドを持つことができます。Java Reflection - サブクラスとスーパークラスからフィールドを取得

私の要件は、すべてのプライベート/パブリックフィールドをサブクラスから取得し、すべてのパブリック/プロテクトフィールドをスーパークラスから取得することです。

以下、私はそれを達成しようとしました。しかし私は私の要求を満たしていませんでした。これを達成するための提案をしてください。私は上記のコードを使用する場合

Field fields [] = obj.getClass().getSuperclass().getDeclaredFields(); 

、私は上記のコードを使用する場合のみ、スーパークラスのフィールドが

Field fields [] = obj.getClass().getFields(); 

、私はサブクラスとスーパークラスのフィールドからすべてのフィールドを取得することができます得ることができます

Field fields [] = obj.getClass().getDeclaredFields(); 

上記のコードを使用すると、すべてのフィールドを公開クラスと非公開クラスにできます。

+0

何がsubclass->スーパーチェーンを反復処理し、フィールドを収集する場合は? –

+2

あなたはすでにあなたが望むすべてのデータを取得する方法をすでに知っているようですが、何が問題なのですか? 1回の呼び出しですべてを取得できると思えば、それはおそらく間違いです。複数のコールを行う必要があり、データの一部をフィルタリングする必要があるかもしれません。しかし、私はあなたが達成しようとしていること、そしてあなたの例のいくつかの組み合わせがそれを達成しない理由を理解していません。 – ajb

+0

@ ajb。私は両方のサブクラスとスーパークラスのフィールドの1つの呼び出しを取得しようとしています。あなたのことを指摘し、あなたの返事をありがとう。 – DEADEND

答えて

6

あなたはこのように、あなたのクラスのすべてのスーパークラスを反復処理する必要があります:

private List<Field> getInheritedPrivateFields(Class<?> type) { 
    List<Field> result = new ArrayList<Field>(); 

    Class<?> i = type; 
    while (i != null && i != Object.class) { 
     Collections.addAll(result, i.getDeclaredFields()); 
     i = i.getSuperclass(); 
    } 

    return result; 
} 
+0

行のコンパイルの問題result.addAll((i.getDeclaredFields()); – DEADEND

+0

List.addAllは配列をとらないため、「Collections.addAll(result、i.getDeclaredFields());」を使用してください –

+0

@ jqnoキリコス(Klitos Kyriacou) – DEADEND

関連する問題