【发布时间】:2011-03-13 10:00:08
【问题描述】:
我正在编写的模型中有一个带有签名public void setFoo(int newFoo) 的方法。我正在使用以下代码从我的控制器中调用它:
protected void setModelProperty(String propertyName, Object newValue) {
for (AbstractModel model: registeredModels) {
try {
Method method = model.getClass().
getMethod("set"+propertyName, new Class[] {
newValue.getClass()
}
);
method.invoke(model, newValue);
} catch (Exception ex) {
// Handle exception.
System.err.println(ex.toString());
}
}
}
像controller.setModelProperty("Foo",5); 这样调用这个方法会导致抛出异常:java.lang.NoSuchMethodException: foo.bar.models.FooModel.setFoo(java.lang.Integer)——看起来int 被装箱为Integer,这与setFoo 的签名不匹配。
有什么方法可以说服这个反射代码将5(或我传入的任何int)作为整数传递,而无需装箱?还是我必须在我的模型中创建public void setFoo(Integer newFoo) 并明确取消装箱,然后调用原始的setFoo?
【问题讨论】:
-
这很奇怪。 Method.invoke() 的 Javadocs 说各个参数会自动解包以匹配原始形式参数,所以看起来这应该不是问题。我在这台机器上没有编译器,否则我会做一些测试。
-
@mmyers 但是 newValue 是一个装箱的 Integer,因此 getMethod 将在 Method.invoke(...) 被调用之前尝试并返回签名为
setFoo(Integer)的(不存在的)方法。 -
@MHarris:就可以了。我看到了getMethod调用,但是因为不寻常的格式,我认为它是一个自我实现的方法,而不是标准的Class方法。
标签: java reflection