Java 反射 - 如何调用 getter/setter 方法?
Java reflection - how to call getter/setter method?
我正在尝试调用对象中某些 属性 的 set 方法,我的代码是这样的:
String[] fieldsStringName = (((CacheObject)currentObject).getFieldsToString(false)).split(", ");
String methodName = "";
for (int i = 0; i < objectInputArr.length; i++) {
methodName = "set" + fieldsStringName[i];
Method methodSetProperty = currentObject.getClass().getMethod(methodName); <<----error occurs here
methodSetProperty.invoke(currentObject, objectInputArr[i]);
}
我得到的错误是:
Exception in thread "main" java.lang.NoSuchMethodException: model.Book.setPagesAmount()
at java.lang.Class.getMethod(Unknown Source)
at CahceSystem.createNewObject(CahceSystem.java:84)
at CahceSystem.main(CahceSystem.java:50)
请求的setter方法在class中写得很好,而且在它的超级class中(仅继承属性),我所有的setter方法都是喜欢:
public void setPagesAmount(int pagesAmount) {
this.pagesAmount = pagesAmount;
}
有什么解决这个问题的建议吗?
currentObject.getClass().getMethod(methodName);
既然方法可以被重载,仅仅方法名是不足以查找方法的。您还需要提供参数的类型(setter 通常不是无参数方法)。
试试
currentObject.getClass().getMethod(methodName, objectInputArr[i].getClass());
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
*Field[] fields = currentObject.getClass().getDeclaredFields();
for (Field field :fields) {
Method method = student.getClass().getMethod("set"+field.getName()
.replaceFirst(field.getName().substring(0, 1), field.getName()
.substring(0, 1).toUpperCase()),field.getType());
}*
试试上面的代码片段。工作正常
我正在尝试调用对象中某些 属性 的 set 方法,我的代码是这样的:
String[] fieldsStringName = (((CacheObject)currentObject).getFieldsToString(false)).split(", ");
String methodName = "";
for (int i = 0; i < objectInputArr.length; i++) {
methodName = "set" + fieldsStringName[i];
Method methodSetProperty = currentObject.getClass().getMethod(methodName); <<----error occurs here
methodSetProperty.invoke(currentObject, objectInputArr[i]);
}
我得到的错误是:
Exception in thread "main" java.lang.NoSuchMethodException: model.Book.setPagesAmount()
at java.lang.Class.getMethod(Unknown Source)
at CahceSystem.createNewObject(CahceSystem.java:84)
at CahceSystem.main(CahceSystem.java:50)
请求的setter方法在class中写得很好,而且在它的超级class中(仅继承属性),我所有的setter方法都是喜欢:
public void setPagesAmount(int pagesAmount) {
this.pagesAmount = pagesAmount;
}
有什么解决这个问题的建议吗?
currentObject.getClass().getMethod(methodName);
既然方法可以被重载,仅仅方法名是不足以查找方法的。您还需要提供参数的类型(setter 通常不是无参数方法)。
试试
currentObject.getClass().getMethod(methodName, objectInputArr[i].getClass());
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
*Field[] fields = currentObject.getClass().getDeclaredFields();
for (Field field :fields) {
Method method = student.getClass().getMethod("set"+field.getName()
.replaceFirst(field.getName().substring(0, 1), field.getName()
.substring(0, 1).toUpperCase()),field.getType());
}*
试试上面的代码片段。工作正常