2013-09-16 155 views
0

我是新來的Java,並試圖找出如何爲自定義對象動態設置屬性的值。我正在使用一個XML解析器,它循環遍歷XML文件中的元素,我只是試圖將字符串設置爲我的臨時值。動態設置對象屬性值

public MyObject tempObj; //gets instantiated before child elements 
public String tempValue; //gets set before each loop 

public void stepThroughChildElement(string elementName) { 
    switch (elementName) { 
     case "Id": 
      tempObj.Id = Integer.parseInt(tempValue); 
      break; 
     case "Version": 
      tempObj.Version = Float.parseFloat(tempValue); 
      break; 
     default: 
      //something like this 
      //tempObj.setProperty(elementName, tempValue); 
      //or 
      //tempObj[elementName] = tempValue; 
      break; 
    } 

} 

在JavaScript中,我只用第二個例子Object["property"] = value;,但很明顯,Java不喜歡的工作。我也發現這個Properties對象,但我不知道它是否相關。

+0

或者使用'Map'作爲[其他](http://stackoverflow.com/a/18828848/2071828)有建議。要獲得更靈活的方法,請使用JAXB等XML綁定框架。 –

+0

不要試圖像使用另一種鬆散類型的語言一樣使用Java。 – Bart

+0

我正在使用SAX http://docs.oracle.com/javase/tutorial/jaxp/sax/parsing.html – tedski

回答

0

由於Java是靜態類型的,你不能只添加屬性那樣。你將不得不給你的對象一個地圖<字符串,字符串>其他屬性。

如果對象已經定義了屬性,您可以對每個對象進行硬編碼或使用java.reflection更動態地執行它。在調用tempObj.getClass()之後,使用代碼輔助並查看所有可用的方法。您可能直接訪問這些字段,或者您可能需要查找並調用setter方法。

+0

我只是在尋找一個快捷方式,而不是說'myObject.String1 = tempValue;','myObject.String2 = tempValue;'等等。 – tedski

+0

反射會成爲你的朋友。我建議緩存方法名稱,當你找到它們時你將會調用它們。 – UFL1138

0

爲什麼不使用Map

Map map = new HashMap(); 
map.put(key, value); 
0

你可以做這樣的事情

tempObj.put("key", new Object()); // use HashtMap's put method 
tempObj.setProperty("key", "value"); // use Proerties' setProperty method 
+0

使用'HashMap'而不是'HashTable'。 'HashTable'是不推薦使用的集合類型。 –

+0

這意味着我的MyObject需要擴展一個HashMap嗎? – tedski