2

Java でオブジェクトのプロパティ名を文字列として使用して、プロパティの厳密に型指定された値を取得する最良の方法は何ですか?

例: age フィールドを整数として持つ Person クラス、たとえば 21。次のステートメントが age フィールドに対して整数 21 を返す必要がある場合、get メソッドの実装はどうすればよいでしょうか? [注: 21 は整数として返されます]

ObjectUtils.get(person, "age");

サンプル メソッド ヘッダー

public static <E> E get(Object object, String fieldName);

1 つの方法は、フィールドの型を取得し、明示的に型をキャストすることです。

別の方法として、 BeanUtilsクラス (Apache コモンズ ライブラリ) のgetPropertyメソッドを使用する方法があります。ただし、厳密に型指定された値ではなく、文字列のみを返すという制限があります。

これを達成するために利用できるより良いアプローチまたはライブラリユーティリティはありますか?

4

2 に答える 2

2

次の実装は目的を果たしました。

@SuppressWarnings("unchecked")
public static <E> E get(Object object, String fieldName) {
    Class<?> clazz = object.getClass();
    while (clazz != null) {
        try {
            Field field = clazz.getDeclaredField(fieldName);
            field.setAccessible(true);
            return (E) field.get(object);
        } catch (NoSuchFieldException e) {
            clazz = clazz.getSuperclass();
        } catch (Exception e) {
            return null;
        }
    }
    return null;
}
于 2013-05-24T11:51:49.933 に答える
1

上記のようにジェネリックを使用しても、実行時に変換さEれる型消去のためにキャストできないため、役に立ちません。私は次のことをお勧めします...EObject

 public static <E> E get(Object source, String fieldName, Class<E> returnType){
      Object field = ...// get field value via reflection possibly using `ReflectionUtils`
      return returnType.cast(field);
 }

アップデート...

経由リフレクションClassからインスタンスを取得することに関するあなたのコメントに従って。Field上記の方がよりシンプルで柔軟であることをお勧めします。上記の呼び出しを行うには、次のことを行う必要があります。

 MyType type = ObjectUtils.<MyType>get(instance, "field");

Field次に、メソッドでオブジェクトを取得し、そこからオブジェクトを取得する必要がありClassます。私のソリューションでは、呼び出しは次のようになります

 MyType type = ObjectUtils.get(instance, "field", MyType.class);

呼び出しは別の場所にあるだけでほぼ同じですが、コードはインスタンスMyTypeを取得する必要がなくなり、呼び出し元は、宣言された型を取得するだけでなく、フィールドがキャストされる可能性のある任意のクラスを渡すことができます。Classキャスト。

于 2013-05-23T10:46:24.630 に答える