3

授業があります:

ClassA{
 public String filedA;
}

ClassB extends ClassA{
 public String filedB;
}

ClassC extends ClassB{
 public String filedC;
}

次に、オブジェクトを作成します。

ClassC c=new ClassC();
c.fieldC="TestC";
c.fieldA="TestA";
c.fieldB="TestB";

すべてのフィールドを取得しようとした後、呼び出します

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

しかし、アイテムが1つだけの配列を取得します

fields[fieldC]

拡張を含むすべてのクラスからすべてのフィールドを取得する方法は?

4

6 に答える 6

10

次のことを試してください。

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

すべてのスーパークラス フィールドが必要な場合は、次を参照してください。

Java Reflection を使用して継承された属性名/値を取得する

于 2012-12-03T14:30:18.957 に答える
7

あなたの C クラスはどのクラスも拡張しません。その後、見たとおりにgetDeclaredFields()のみ戻りますString filedC。クラスがこのフィールドを宣言していないため、c.fieldA="TestA"実行できません。c.fieldB="TestB"とにかく、C が B を拡張し、B が A を拡張する場合、メソッドgetFields()は public フィールドのみを返します (継承を含む):

この Class オブジェクトによって表されるクラスまたはインターフェイスのすべてのアクセス可能なパブリック フィールドを反映する Field オブジェクトを含む配列を返します。

getDeclaredFields()は、クラスで宣言されたすべてのフィールドを返します (継承されたものは含まれません)。

この Class オブジェクトによって表されるクラスまたはインターフェイスによって宣言されたすべてのフィールドを反映する Field オブジェクトの配列を返します。これには、パブリック、保護、デフォルト (パッケージ) アクセス、およびプライベート フィールドが含まれますが、継承されたフィールドは除外されます。

于 2012-12-03T14:36:08.423 に答える
6

車輪を再発明したくない場合は、以下を提供するApache Commons Langバージョン 3.2+ に頼ることができますFieldUtils.getAllFieldsList

import java.lang.reflect.Field;
import java.util.AbstractCollection;
import java.util.AbstractList;
import java.util.AbstractSequentialList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

import org.apache.commons.lang3.reflect.FieldUtils;
import org.junit.Assert;
import org.junit.Test;

public class FieldUtilsTest {

    @Test
    public void testGetAllFieldsList() {

        // Get all fields in this class and all of its parents
        final List<Field> allFields = FieldUtils.getAllFieldsList(LinkedList.class);

        // Get the fields form each individual class in the type's hierarchy
        final List<Field> allFieldsClass = Arrays.asList(LinkedList.class.getFields());
        final List<Field> allFieldsParent = Arrays.asList(AbstractSequentialList.class.getFields());
        final List<Field> allFieldsParentsParent = Arrays.asList(AbstractList.class.getFields());
        final List<Field> allFieldsParentsParentsParent = Arrays.asList(AbstractCollection.class.getFields());

        // Test that `getAllFieldsList` did truly get all of the fields of the the class and all its parents 
        Assert.assertTrue(allFields.containsAll(allFieldsClass));
        Assert.assertTrue(allFields.containsAll(allFieldsParent));
        Assert.assertTrue(allFields.containsAll(allFieldsParentsParent));
        Assert.assertTrue(allFields.containsAll(allFieldsParentsParentsParent));
    }
}
于 2016-04-12T08:54:49.800 に答える
1

getDeclaredFields()スーパークラスから継承されたフィールドが含まれていません。

すべてのクフィールドが必要な場合は、getFields()メソッドを使用するだけです

于 2012-12-03T14:48:08.143 に答える
1

これは、から派生した場合(およびおそらくなどからClassC派生した場合)、リフレクションで機能します。これはタイプミスだと思いますか?次に、これ:ClassBClassA

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

期待どおりに動作します。

于 2012-12-03T14:32:36.947 に答える
0

あなたはそれらを手に入れることができるはずです

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

これにより、アクセス可能なすべてのフィールドが返されます。

于 2012-12-03T14:31:23.357 に答える