我有一个具有以下结构的 XML 文件:
<object type="People">
<field id="name" type="class java.lang.String" value="Ivan"/>
<field id="age" type="class java.lang.Integer" value="23"/>
<field id="salary" type="class java.lang.Double" value="50.0"/>
</object>
但是对象类型和字段可以不同。
例如:
<object type="Worker">
<field id="lastName" type="class java.lang.String" value="Ivan"/>
<field id="height" type="double" value="170.00"/>
<field id="salary" type="double" value="50.0"/>
</object>
是否可以从具有未知字段的 XML 创建对象?
最佳答案
当生活为您提供灵活的对象时,包装器就是您的 friend 。
您的“XmlObject”理想情况下应如下所示。
public class XmlObject {
final String type;
Map<String, ObjectWrapper> map = new Map<>();
public XmlObject(String type) {
this.type = type;
}
public void put(String key, ObjectWrapper object) {
map.add(key, object);
}
public ObjectWrapper get(String key) {
return map.get(key);
}
}
然后,您的包装器使用泛型,并可以选择返回类类型。
public class ObjectWrapper<T> {
private T value;
public ObjectWrapper (T value) {
this.value = value;
}
//from http://stackoverflow.com/a/8019188/2958086
public Class<T> getPersistentClass() {
if (persistentClass == null) {
this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
return persistentClass;
}
}
如果需要,您可以在声明时提供对象类型,以及任何类型的类型解析或数据转换。我假设这些类型是标准的可解析类型,因此您可以在 XML 解析器中根据类型进行处理和存储。
String key, type, value; //from xml;
ObjectWrapper object;
if(type.contains("String")) {
object = new ObjectWrapper<String>(value);
}
else if(type.contains("Double")) {
object = new ObjectWrapper<Double>(Double.parseDouble(value));
}
xmlObject.add(key, object);
之后,您可以根据键获取对象,或者使用标准映射函数获取键映射。要获取对象的类型,您可以获取其持久类。
关于java - 如何在航类从 xml 创建类和对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42211170/