2012-04-05 79 views
0

好吧,我努力學習java的MVC模式,但我不明白下面的方法:MVC(Model View 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 
      } 
     } 
    } 

我不」明白:

Method method = model.getClass(). 
        getMethod("set"+propertyName, new Class[] { 
                 newValue.getClass() 
                } 
          ); 

所以在getMethod我們根據屬性檢索(setSomething)方法名稱,那麼下面的「thing」就是屬性值newValue,這個表達式是我根本不理解的奇特表達式。

new Class[] < ---所以它是一個類的數組? 下一個{ newValue.getClass() } < ----好的,通過調用方法獲取括號中的類名,但是分號呢?必須有一些我不明白的特殊結構,它看起來像一個班級,但是如果沒有分號,那肯定會有所不同......人們向我解釋這是什麼請求...

+0

它沒有與MVC鏈接,但與自省/反射。你可以動態地查看和調用任何對象的方法。 – 2012-04-05 10:19:33

回答

1

這是一種抽象的編碼方式,老實說,如果可以做到這一點(例如通過使用模板),特別是在初學者級別,我會勸阻這種工作方式。無論如何,我會盡力解釋。

Java中的所有類也是類Class的對象。所有方法都是Method類的對象。您可以像處理任何其他對象一樣操作這些對象,方法是調用它們的方法並將它們用作其他方法的參數等等。這樣,你可以通過只知道它的名字作爲一個字符串來完美地實例化一個類。方法相同:您可以通過簡單地將其名稱作爲字符串進行調用來調用方法。

現在我們來看看你的代碼。請快速瀏覽Java API中的this entry,以獲得對此部分getMethod("set"+propertyName, new Class[] {newValue.getClass()});的簡要說明。

說你要調用的方法setParameter(int parameterValue) {...}。在這種情況下,我們將您的方法稱爲propertyName設置爲"Parameter"newValue設置爲某個整數123。現在"set"+propertyName結果爲setParameter,這是我們方法的名稱。 newValue.getClass()給出Integer,因爲這就是123

儘管getMethod需要一個Classes數組,但因爲可能存在一些具有相同名稱的方法,但具有不同數量和類型的參數(例如存在方法setParameter(double parameterValue) {...})。所以我們通過編寫new Class[] {newValue.getClass()}newValue.getClass()放入只有一個項目的數組中。

有你有它:您可以通過調用

Method method = model.getClass(). getMethod("set"+propertyName, new Class[] {newValue.getClass()});

檢索Method對象,然後調用使用method.invoke(model, newValue);該方法,這是簡單地調用setParameter(123)的動態方式。

1

假設你撥打像

setModelProperty("Key", "value"); 

的方法,然後在循環中的代碼將所有註冊模型方法搜索與簽名

<any modifiers> <any returntype> setKey(String value); 

,並調用該方法的下一行。

它將採取屬性值構造一個setter方法名稱和值類以獲得一個Class實例。 getMethod方法只需要一個類的數組,因爲我們希望能夠找到多於一個參數的方法。

2

隨着:

new Class[] { newValue.getClass() } 

要指定的類內聯的數組,並將它傳遞給getMethod的論點。

這可能是一個有點混亂,由於在混合有「類」,但它只是爲有效的,就像這樣:

Integer[] bla = new Integer[]{1,2,3,4}; 

getMethod接收作爲參數,你正在尋找的方法的名稱一個類和一個指定所述方法參數的類的數組。例如:

getMethod("setValues", new Class[]{String.class, Integer.class} 

看起來像一個方法:

public Something setValues(String p1, Integer p2) 

這將不匹配,即使它存在於同一個班級,是這樣的:

public Something setValues(String p1) 

或其他任何變異。

2

爲了回答你有關陣列的語法問題,這只是你如何定義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}; 

表達new Class[] {newValue.getClass()}因此Class實例的數組,包含一個元素:的newValue.getClass()結果,因此是newValue的類別。

請注意,我不知道你在哪裏得到這個代碼,但我不會把它好的代碼:

  • 它使用反射,這是,大部分的時間,一個壞主意;
  • 它不尊重JavaBean慣例,也不使用java.beans API來訪問setter方法。
  • 它不支持繼承,這意味着你只能調用setFoo(Object o)與Object類型(而不是字符串,整數或其他)的對象。