如何在飞行中从 xml 创建类和对象



我有一个具有以下结构的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创建对象?

当生活给你灵活的对象时,包装纸就是你的朋友。

理想情况下,您的"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;
    }
}

声明时提供 Object 类型,如有必要,还可以提供任何类型的类型分析或数据转换。我假设这些类型是标准的可解析类型,因此您可以在 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);
之后,您可以基于键获取

对象,或使用标准映射函数获取键映射。若要获取对象的类型,可以获取其持久类。

最新更新