Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MVC(模型-视图-控制器);请给我解释一下这个方法_Java_Model View Controller - Fatal编程技术网

Java MVC(模型-视图-控制器);请给我解释一下这个方法

Java MVC(模型-视图-控制器);请给我解释一下这个方法,java,model-view-controller,Java,Model View Controller,我试图学习java MVC模式,但我不理解以下方法: protected void setModelProperty(String propertyName, Object newValue) { for (AbstractModel model: registeredModels) { try { Method method = model.getClass(). getMeth

我试图学习java MVC模式,但我不理解以下方法:

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
            }
        }
    }
我不明白:

Method method = model.getClass().
                    getMethod("set"+propertyName, new Class[] {
                                                      newValue.getClass()
                                                  }
                             );
因此,在getMethod中,我们根据属性检索(setSomething)方法名称,然后下面的“东西”是属性值作为newValue,它用这个奇特的表达式表示,我一点也不理解


newclass[]
假设调用如下方法

setModelProperty("Key", "value");
然后,循环中的代码将在所有注册的模型中搜索带有签名的方法

<any modifiers> <any returntype> setKey(String value);
setKey(字符串值);
并在下一行调用该方法


它将使用属性值来构造setter方法名称,并使用values类来获取
实例。
getMethod
方法接受一个类数组,只是因为我们希望能够找到具有多个参数的方法

假设您调用以下方法

setModelProperty("Key", "value");
然后,循环中的代码将在所有注册的模型中搜索带有签名的方法

<any modifiers> <any returntype> setKey(String value);
setKey(字符串值);
并在下一行调用该方法

它将使用属性值来构造setter方法名称,并使用values类来获取
实例。
getMethod
方法接受一个类数组,只是因为我们希望能够找到具有多个参数的方法

使用以下选项:

new Class[] { newValue.getClass() }
您正在内联指定一个类数组,并将其传递给getMethod的参数

由于混合中有“类”,这可能会有点混乱,但它与以下内容一样有效:

Integer[] bla = new Integer[]{1,2,3,4};
public Something setValues(String p1)
getMethod作为参数接收您在类中查找的方法的名称,以及指定所述方法参数的类数组。例如:

getMethod("setValues", new Class[]{String.class, Integer.class}
将查找以下方法:

public Something setValues(String p1, Integer p2)
即使它存在于同一个类中,也不会匹配,例如:

Integer[] bla = new Integer[]{1,2,3,4};
public Something setValues(String p1)
或任何其他变体。

带有:

new Class[] { newValue.getClass() }
您正在内联指定一个类数组,并将其传递给getMethod的参数

由于混合中有“类”,这可能会有点混乱,但它与以下内容一样有效:

Integer[] bla = new Integer[]{1,2,3,4};
public Something setValues(String p1)
getMethod作为参数接收您在类中查找的方法的名称,以及指定所述方法参数的类数组。例如:

getMethod("setValues", new Class[]{String.class, Integer.class}
将查找以下方法:

public Something setValues(String p1, Integer p2)
即使它存在于同一个类中,也不会匹配,例如:

Integer[] bla = new Integer[]{1,2,3,4};
public Something setValues(String p1)

或任何其他变体。

要回答有关数组语法的问题,以下是您在Java中定义数组的方式:

int[] intArray = new int[] {1, 2, 3};
String[] stringArray = new String[] {"a", "b", "c"};
Class classArray = new Class[] {Integer.class, String.class, Double.class};
因此表达式
newclass[]{newValue.getClass()}
是一个
Class
实例数组,包含一个元素:
newValue.getClass()
的结果,它是
newValue
的类

请注意,我不知道您从何处获得此代码,但我不会称之为好代码:

  • 它使用反射,这在大多数情况下是一个坏主意
  • 它不遵守JavaBean约定,也不使用
    java.beans
    API来访问setter方法
  • 它不支持继承,这意味着您只能使用Object类型的对象调用
    setFoo(objecto)
    (而不是String、Integer或其他类型的对象)

要回答您关于数组语法的问题,以下是您在Java中定义数组的方式:

int[] intArray = new int[] {1, 2, 3};
String[] stringArray = new String[] {"a", "b", "c"};
Class classArray = new Class[] {Integer.class, String.class, Double.class};
因此表达式
newclass[]{newValue.getClass()}
是一个
Class
实例数组,包含一个元素:
newValue.getClass()
的结果,它是
newValue
的类

请注意,我不知道您从何处获得此代码,但我不会称之为好代码:

  • 它使用反射,这在大多数情况下是一个坏主意
  • 它不遵守JavaBean约定,也不使用
    java.beans
    API来访问setter方法
  • 它不支持继承,这意味着您只能使用Object类型的对象调用
    setFoo(objecto)
    (而不是String、Integer或其他类型的对象)

这是一种有点抽象的编码方式,老实说,如果可能的话(例如通过使用模板),我不鼓励这种工作方式,尤其是在初学者级别。无论如何,我会尽力解释的

Java中的所有类也是该类的对象。所有方法都是类方法的对象。通过调用这些对象的方法并将其用作其他方法的参数等,可以像处理任何其他对象一样处理这些对象。这样,只需知道类的名称是字符串,就可以完美地实例化类。方法也是一样:只需知道方法名为字符串,就可以调用方法

现在让我们看看您的代码。快速查看Java API中关于这一部分的简要说明
getMethod(“set”+propertyName,新类[]{newValue.getClass()})

假设您想调用方法
setParameter(int-parameterValue){…}
。在这种情况下,我们将
propertyName
设置为
“参数”
并将
newValue
设置为某个整数
123
来调用您的方法。现在,
“set”+propertyName
会产生
setParameter
,这是我们方法的名称
newValue.getClass()
给出了
Integer
,因为这就是
123
的含义

但是,
getMethod
需要一个类数组,因为可能存在许多同名的方法,但参数的数量和类型不同(例如,方法
setParameter(double parameterValue){…}
也可能存在)。因此,我们通过编写
newclass[]{newValue.getClass()}
将该
newValue.getClass()
放在一个只有一个项的数组中

这样就可以了:通过调用

<