1. ホーム

[解決済み】JavaリフレクションのgetFieldsとgetDeclaredFieldsの違いは何ですか?

2022-04-07 18:59:10

質問

の違いについて少し混乱しています。 getFields メソッドと getDeclaredFields メソッドを使用します。

私はそれを読んで getDeclaredFields を使うとクラスのすべてのフィールドにアクセスできるようになり getFields はパブリックフィールドのみを返します。もしそうであれば、なぜいつも getDeclaredFields ?

どなたか、この件について詳しく説明してください。2つの方法の違いや、いつ、なぜどちらかを使いたいのか、説明してください。

どのように解決するのですか?

getFields()

すべての public フィールドを、クラス階層全体にわたって表示します。

getDeclaredFields()

すべてのフィールドは、アクセシビリティに関係なく、現在のクラスのものであり、現在のクラスが継承している可能性のあるベースクラスではありません。

すべてのフィールドを階層的に取得するために、次のような関数を書きました。

public static Iterable<Field> getFieldsUpTo(@Nonnull Class<?> startClass, 
                                   @Nullable Class<?> exclusiveParent) {

   List<Field> currentClassFields = Lists.newArrayList(startClass.getDeclaredFields());
   Class<?> parentClass = startClass.getSuperclass();

   if (parentClass != null && 
          (exclusiveParent == null || !(parentClass.equals(exclusiveParent)))) {
     List<Field> parentClassFields = 
         (List<Field>) getFieldsUpTo(parentClass, exclusiveParent);
     currentClassFields.addAll(parentClassFields);
   }

   return currentClassFields;
}

exclusiveParent からフィールドを取得することを防ぐために提供されています。 Object . それは null が必要な場合は Object のフィールドを使用します。

明確にするために Lists.newArrayList はグアバからきています。

更新情報

参考までに、上記のコードはGitHubで公開されている私の LibEx プロジェクトで ReflectionUtils .