タイトル失礼します…
以下に示すように使用される foo() のようなメソッドがあります
public static <T> void foo(T fld1, T fld2) {
// here i use some info from fld1 and some from fld2 in order
// to do something
}
foo(a1.myField, a2.myField)
- コンパイル時に myField が実際にオブジェクトのフィールドであることを確認したい
.myField
2回繰り返す必要を避けたい- メソッドを次のように呼び出せないようにしたい
foo(a1.myField, a2.anotherField);
リフレクションが私の問題に対する答えであるかどうかはわかりません。
私はこのようなものを書くことができます:
static <C> void foo(C o1, C o2, String fieldName) {
try {
Object fld1 = o1.getClass().getField(fieldName).get(o1);
Object fld2 = o2.getClass().getField(fieldName).get(o2);
// here i use some info from fld1 and some from fld2 in order
// to do something
} catch (Exception e) {
}
}
しかし、fieldName がクラス C の有効なフィールド名であるかどうかをコンパイル時に確認できません。
方法があると助かります
Field getField(Object field)
となることによって
getField(a1.myField)
に等しい
a1.getClass().getField("myField")
今、私はこのメソッドを書きます:
public static <T> Field getField(T o, Object fld) {
Field rv = null;
try {
Field[] fields = o.getClass().getFields();
for (Field field : fields) {
Object f = field.get(o);
if (f==fld) {
rv = field;
break;
}
}
} catch (Exception e) {
}
return rv;
}
このように使用します
getField(a1, a1.myField);
答えてくれてありがとう、カルロ