私は2つのクラスを取得しました:B
extends A
。
私はgetDeclaratedFields()
クラスB
で使用していますが、クラス`Aからフィールドを取得していません。
どうすれば入手できますか?
私は2つのクラスを取得しました:B
extends A
。
私はgetDeclaratedFields()
クラスB
で使用していますが、クラス`Aからフィールドを取得していません。
どうすれば入手できますか?
getDeclaredFields()は、スーパークラスではなくクラスによって宣言されたフィールドを返します。
このClassオブジェクトによって表されるクラスまたはインターフェイスによって宣言されたすべてのフィールドを反映するFieldオブジェクトの配列を返します。これには、パブリック、保護、デフォルト(パッケージ)アクセス、およびプライベートフィールドが含まれますが、継承されたフィールドは除外されます。
getFieldsメソッドを使用して、クラスおよびスーパークラスによって宣言されたフィールドを取得します。
具体的には、このClassオブジェクトがクラスを表す場合、このメソッドはこのクラスとそのすべてのスーパークラスのパブリックフィールドを返します。
詳細については、 Javaクラスをお読みください。
Class#getSuperclass()を使用してクラスのスーパークラスにアクセスし、Class#getDeclaredFields()を使用してそのフィールドも取得し、オブジェクトまたは停止する選択したクラスに到達するまで(再帰的に)繰り返します。
サンプルコードは次のとおりです。
@Test
public void getDeclFieldsIncludingBase() {
List<Field> fields = new ArrayList<>();
getDeclFieldsIncludingBase(B.class, fields);
for(Field f : fields) {
System.out.println(f.getName());
}
}
private void getDeclFieldsIncludingBase(Class<?> cl, List<Field> fields) {
Field[] declaredFields = cl.getDeclaredFields();
for(Field f : declaredFields) {
fields.add(f);
}
Class<?> superclass = cl.getSuperclass();
if(! Object.class.equals(superclass)) {
getDeclFieldsIncludingBase(superclass, fields);
}
}
例:
public class A {
int a;
}
と
public class B extends A {
int b;
}
出力は次のようになります
b
a