有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java反射如何调用getter/setter方法?

我试图调用对象中某个属性的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方法在类及其超类(仅继承属性)中编写得很好,我的setter方法如下:

public void setPagesAmount(int pagesAmount) {
    this.pagesAmount = pagesAmount;
}

如何解决这个问题有什么建议吗


共 (2) 个答案

  1. # 1 楼答案

    currentObject.getClass().getMethod(methodName);
    

    由于方法可以重载,因此仅方法的名称不足以查找该方法。您还需要提供参数的类型(setter通常不是no-arg方法)

    试试像这样的东西

    currentObject.getClass().getMethod(methodName, objectInputArr[i].getClass());
                                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
  2. # 2 楼答案

    *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());
    }*
    

    请尝试上面的代码片段。工作正常