很抱歉的标题...反射有帮助吗?
我有类似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) {
}
}
,但我不能在编译时检查,如果字段名是一个有效的字段名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);
感谢您的任何答案,卡罗
myField和anotherField是否返回相同的类型?或者他们返回什么类型? – Damian0o
myField和另一个字段是相同的类型(否则我得到一个编译错误),但我想避免这种情况。我想FLD1和FLD2是同一类 – Carlo