2013-09-16 122 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