gpt4 book ai didi

java - Java 中的拆箱和反射?

转载 作者:行者123 更新时间:2023-11-30 05:59:21 26 4
gpt4 key购买 nike

在我正在编写的模型中,我有一个带有签名 public void setFoo(int newFoo) 的方法。我正在使用以下代码从我的 Controller 中调用它:

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?

最佳答案

您可以将您的 setModelProperty 专门化为您希望使用的任何原语:

protected void setModelProperty(String propertyName, int newValue) { /* ... */ }

或者,您可以在 newValue 上使用 instanceof 来检查盒装基元:

Class[] classes;
if (newValue instanceof Integer) {
classes = new Class[] { int.class };
} else if (newValue instanceof Double) {
/* etc...*/
} else {
classes = new Class[] {newValue.getClass() };
}

或者最后,如果您有 setFoo 的源代码,您可以将其更改为采用装箱 Integer 而不是 int - 开销通常可以忽略不计。

关于java - Java 中的拆箱和反射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3205098/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com