2012-04-23 36 views
-2

我有一個小小的疑問。 有沒有辦法在運行時獲取對象?獲取名稱未知的屬性直到運行時間

事情是這樣的: 我有一個類說員工和產品具有以下特性名,addrees,ID

現在我有Employee的一個對象,但我得取決於一定條件的財產之一。

因此它可能是運行時的emp.getName()或emp.getID()。

我該如何做到這一點?

問候, 阿米特

+0

所有對象都在運行時實例化。檢索未在您的Java代碼中靜態設置的信息並使用它構建新對象的功能與您所做的完全相同 – ControlAltDel 2012-04-23 17:24:43

回答

1

嘗試

String str = (condition) ? emp.getName() : emp.getID(); 

final String str; 
switch(userSelectedField) { 
    case "lastname": str = emp.getName().getLastName(); break; 
    case "zipcode": str = emp.getCountry().getState().getZipCode(); break; 
    default: /* report an error */ 
} 
+0

是的。以正常方式進行。 – 2012-04-23 17:24:30

+0

其實並不那麼簡單。 有一百個屬性和太多的級別。 我必須使用這些屬性來比較它們的值,具體取決於用戶在運行時選擇的屬性。 因此可能emp.getName.getLastName 或者如果他選擇國家的郵政編碼 這將是emp.getCountry.getState.getZipCode() – 2012-04-23 17:25:26

+0

如果你有很多這樣的嘗試,而不是開關。 – 2012-04-23 17:32:11

0

如果有數百個屬性(如你在評論提到),那麼一個選擇是將其保存全部在Map<String, SomeType>。訪問非常簡單,爲密鑰傳遞一個String(或一個Enum)。主要缺點是它們的值都是SomeType(實際上可能是字符串),你可能真的希望它們中的一些是整數,日期等。在這種情況下,有幾種選擇:

  1. 調用者必須知道類型和解析。例如,Map將日期存儲爲字符串「01/23/1967」,調用者知道KEY_BIRTHDAY應該轉換爲日期,但是您有實用程序代碼,調用方用它將其轉換爲日期。

  2. 或者地圖知道類型,可能通過另一個Map<String, Class>與每個值的類別進行轉換。

1

如果你的對象符合JavaBeans的約定的getter/setter的命名,PropertyUtils.getProperty,從Apache的BeanUtils的圖書館,看起來像它會做的工作很好,如this question描述。

例如,你可以不喜歡

String field = "name.lastname"; // or could be read dynamically from user input 
Object value = PropertyUtils.getProperty(emp, field); 

處理您的嵌套屬性。

+0

與我的地圖創意相比,這會稍微慢一些(使用反射,但在大多數應用中不太可能發生),並且仍然存在所有內容都以對象形式返回而不是「真實」類型的缺點。但是,它有一個很大的優點,即如果代碼已經寫入了100個字段,則不需要重寫使用Map! – user949300 2012-04-23 18:27:58

+0

完美,這解決了問題。非常感謝幫助。非常感謝你。 – 2012-04-23 20:52:29