Javaの反射のget特定の文字列としてフィールドの値を宣言しました

Lokeshkumar R:

(requestDtoは多くの宣言フィールドを持っていますが、私はこのカスタムフィールドをしたい)と私はRequestDtoで宣言されたフィールドを持つています

private String custom; 

私は文字列として、この宣言フィールド名カスタムを取得したいです

お気に入り String name-"custom"(but custom has to be dynamic)

解決策は、デフォルトのgetterとsetterを変更せずにする必要があり

実際に私はDTOは悪いデータを持っている要求のフィールドの1、私は無関係なデータを持っていた文字列としてフィールド名と一緒にエラーメッセージを提供しなければならない場合requestDtoは、コンテンツの検証のために処理されたときのような問題を抱えています

私はRequestDtoから文字列などのカスタムフィールド名を持っていると思ったので、カスタムフィールドは、将来的にRequestDtoに変更されたときに問題があり、それを修正する人は、そうであっても、そのカスタムフィールドは文字列として設定され、それが使用されている知っていることはありませんこれまでのフィールドの値が変更されたとき、私は、文字列に変更した名前を取得します

ローランド:

編集:あなたは、「誰かが将来的にその名前を変更した場合にどのような」コメントに記載されている情報の最も重要な部分を追加した後...よく...その後反射が進むべき道ではありません!

私は、むしろのようなもの使用するFunction<RequestDto, String>代わりに、または類似の、例えば:

static String getCustom(RequestDto requestDto, Function<RequestDto, String> customExtractor) {
  return customExtractor.apply(requestDto);
}

そして、それを経由して呼び出します。

RequestDto someRequest = ...;
getCustom(someRequest, RequestDto::getCustom);

そのフィールドは、一部が自動的にすぎその後、リファクタリングされることが、将来的にリファクタリングされている場合は(も...おそらくあなたのIDEに依存します;-))。しかし...それはあなたのエラーメッセージのような適切なフィールド名を与えることはありません。それを得るための唯一のプロパティは、その名の場合は、右側のフィールドをキャッチする良い方法がないことに注意してください。あなたがフィールドに注釈を置く場合は、その特定のアノテーションでフィールドをフィルタし、つかむことができました。そうすれば、あなたは、実際の名前を知っている必要はありません...しかしcounterquestion:どのように確認のみ1フィールドはその注釈とannotedされていることをすることができますか?私はむしろ、アプリケーションの特定の部分を再設計します。私は、「クライアント」に任意のフィールドを公開しません。私は、エラーメッセージやフィールド名に、潜在的に異なる名前を有することを意味するが、それを可能ならば。

現代のIDEは同様に(あなたは、フィールドの名前を変更する場合)リファクタリング文字列にあなたを許すことにも注意してください。あなたは、この情報は、その後のチームに分散していることを確認する必要があります(また、将来のメンバー)。


リフレクションを使用して前の答え:

あなたが意味ダイナミックとした場合、次のように、それはその名前で始まるか、その名前を含まなければならないことを、あなたはすなわち、使用のものにしたいことがありgetDeclaredFields()、それらを超えると反復が興味を持ってフィールドをフィルタリングします:

private static String getCustom(RequestDto requestDto) throws NoSuchFieldException, IllegalAccessException {
    return Arrays.stream(requestDto.getClass().getDeclaredFields())
            .filter(e -> e.getName().startsWith("custom"))
            .findFirst() // if the first match suffices
            .map(f -> {  // you may want to extract that part if you use streams
                f.setAccessible(true);
                try {
                    return (String) f.get(requestDto);
                } catch (IllegalAccessException e) {
                    // TODO whatever you need to do...
                    return null;
                }
            }).orElseThrow(IllegalArgumentException::new); // or whatever suites better
}

このサンプルでは、​​ちょうどそれに応じて、フィルタを適応させるなど、タイプ別または注釈によってフィルターに必要な場合には十分です。

それはあなたが必要とするフィールドの名前だけなら、それはField.getName()あなたが何をしたいです。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=203049&siteId=1