对不起标题...
我有一个像 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
两次 - 我希望不能将方法称为
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);
感谢您的任何回答,卡洛