对不起,这个标题...
我有一个像 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);
感谢您的回答,卡洛
最佳答案
您可以在运行时使用方法中的instanceOf
进行检查。
只是例子:
if(fd1 instanceOf Fd1Obj)
关于java - 反射(reflection)有用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17166941/