通过反射设置子类的字段

时间:2016-06-07 10:04:27

标签: java reflection

我正在尝试设置子类对象的字段值:

public void setValue(Serializable target, String fieldName, float changer) {
...
//next I'm accessing field "deal" of sub-class "Mon" of class "Hum"
//Hum target
//String upper value is "Mon"
//String fieldName value is "deal"
//float changer is some valid number
Field theField = target.getClass().getDeclaredField(upper).get(target).getClass().getDeclaredField(fieldName);
switch (theField.getType().getName()) {
    case "float":
        theField.setFloat(target, changer); //the line with error!
        break;
    case "int":
...
}

代码抛出

IllegalArgumentException: Can not set float field hb.Hum$Mon.deal to hb.Hum

好的,但当我把问题线改为:

theField.setFloat(target.getClass().getDeclaredField(upper).get(target).getClass(), changer)
它扔了NullPointerException。 我显然搞乱了现场访问,但我无法弄清楚我到底做错了什么。任何人,请指出一个错误吗?

PS

工作代码是(我不应该第二次调用getClass()):

theField.setFloat(target.getClass().getDeclaredField(upper).get(target), changer)

1 个答案:

答案 0 :(得分:1)

问题不在于您的代码所做的事情,而在于您如何调用它。您正在为目标传递外部类hb.Hum的实例,而代码需要嵌套类 hb.Hum.Mon

您需要确保在致电setValue时,第一个参数的类型正确。这将解决问题。