我在寫一個模型中有一個簽名爲public void setFoo(int newFoo)
的方法。我使用下面的代碼從我的控制器中調用它:在Java中取消裝箱和反射?
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我傳入)作爲一個整數,沒有拳擊?或者我必須明確地在我的模型和unbox中創建public void setFoo(Integer newFoo)
,然後調用原始的setFoo?
這是奇怪的。 Method.invoke()的Javadocs表示單個參數自動解包以匹配原始形式參數,所以看起來這應該不成問題。我在這臺機器上沒有編譯器,或者我會做一些測試。 – 2010-07-08 15:21:24
@mmyers但newValue是一個盒裝Integer,因此getMethod將在調用Method.invoke(...)之前嘗試並返回帶有簽名'setFoo(Integer)'的(非遠程)方法。 – MHarris 2010-07-08 15:24:06
@MHarris:那樣做。我看到了getMethod調用,但由於格式不正常,我認爲這是一種自我實現的方法,而不是標準的Class方法。 – 2010-07-08 15:41:47