Java MVC(模型-视图-控制器);请给我解释一下这个方法
我试图学习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
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约定,也不使用
API来访问setter方法java.beans
- 它不支持继承,这意味着您只能使用Object类型的对象调用
(而不是String、Integer或其他类型的对象)setFoo(objecto)
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约定,也不使用
API来访问setter方法java.beans
- 它不支持继承,这意味着您只能使用Object类型的对象调用
(而不是String、Integer或其他类型的对象)setFoo(objecto)
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()
放在一个只有一个项的数组中
这样就可以了:通过调用
<