2009-06-26 62 views
0

您好!如何基於數組中的字符串訪問方法?

我甚至不確定這是否可能,但希望它是在Java中。我知道我在PHP中通過使用變量變量和動態訪問變量來完成它,但是我在Java中讀到了這個不同的問題。

我有一個字符串數組,其中包含我的JSF GUI中複選框的狀態。如果所有複選框都已設置,則數組將填充包含不同複選框值的字符串。

private static final String[][] OVERVIEW_FIELDS = {{"ID", "requestid"}, 
    {"Date added", "dob"}, {"Title", "requestTitle"}, {"Process", "processId"}, 
..., ..., ...}; 

然後,我通過數組循環,使JSF一個SelectItems出來的:

for (int i = 0; i < OVERVIEW_FIELDS.length; i++) { 
    SelectItem item = new SelectItem(OVERVIEW_FIELDS[i][0], OVERVIEW_FIELDS[i][1]); 
    getFields().add(item); 
} 

複選框的標籤和值是通過一個數組,看起來像這樣循環建立

問題和目前的解決方案(希望有人可以幫助我重構成更好的東西:

for (String item : getVisibleFields()) { 
      if (item.equals("dob")) { 
       setDob(true); 
      } 
      if (item.equals("requestTitle")) { 
       setRequestTitle(true); 
      } 
      if (item.equals("processId")) { 
       setProcessId(true); 
      } 
      if (...) { 
      } 
} 

繼續等待11個布爾值。我不喜歡這個解決方案,並且在我的系統中的其他bean中看到類似的模式。

有誰知道是否有更好的解決方案?布爾值控制列,根據複選框數組包含的內容將渲染字段設置爲true/false。

我希望在JSF EL中可以訪問visibleFields變量和contains方法,因此如果對象存在於數組中,則返回true或false。這似乎並沒有工作,但EL沒有給我訪問包含方法。

我目前使用:

rendered="#{overviewFilterBean.dob}" 

我試着用這個代碼:

rendered="#{overviewFilterBean.visibleFields.contains['dob']}"> 

現在,這促使我嘗試使用我的最後一個數組,並根據getFields().contains(OVERVIEW_FIELDS[i][1])設置布爾值,但我怎麼能使這成爲可能?

部分真實,部分僞代碼如下(我現在瞄準的解決方案):

for (int i = 0; i < OVERVIEW_FIELDS.length; i++) { 
    if (item.equals(OVERVIEW_FIELDS[i][1])) { 
      setOVERVIEW_FIELDS[i][1](true); 
     } 
    } 

的一大問題:

有我從OVERVIEW_FIELDS[i][1]使用值的方式設置正確的布爾變量,或者我可以把它變成一個地圖,並使用JSF EL來檢查地圖中是否存在關鍵字?

謝謝您的時間,對不起,寫這麼長的問題得到一個小點:/

編輯:

反射方法導致5個例外,代碼塊大處理它們,也有人說它是一種昂貴的方法。這使我相信,無論是我的舊解決方案還是使用地圖都是最好的方法。我會嘗試地圖解決方案=)

回答

0

您可以使用Java反射API動態地查找字段並設置它,如在this example。請注意,這種方法的性能會受到影響。

3

隨着reflection,你可以這樣做:

for (String item : getVisibleFields()) { 
    getClass().getMethod("get" + capitalize(item)).invoke(this, true); 
} 

異常處理和capitalize方法作爲練習留給讀者(invoke拋出一個很多例外)。

+0

你好,並感謝您顯示的代碼,這種方式可以完成。正如你所說的那樣,這會產生大量的例外,如果它是一種非常昂貴的做事方式,也許只需嘗試每個布爾值就可以讓IM變得更好? – 2009-06-26 21:51:55

相關問題