Динамическое добавление атрибутов без изменения объекта Java
Я хочу добавить еще один новый атрибут в поле без изменения объекта Java.
<field attribute1 = "1" attribute2 = "2" attribute3 = "3"> value</filed>
@XmlRootElement(name = "field ")
public class Field
{
@XmlAttribute(name="attribute1")
private String attribute1;
@XmlAttribute(name="attribute2")
private String attribute2;
@XmlAttribute(name="attribute3")
private String attribute3;
}
Если я хочу добавить новый атрибут 4 в XML без изменения класса поля (добавление нового поля в класс и перекомпиляция).
Есть способ сделать это?
1 ответ
Решение
Если вы хотите, чтобы класс Java мог хранить любой атрибут, вам нужен Map
для хранения пар имя / значение атрибута, и вам нужно пометить это поле @XmlAnyAttribute
,
Вот пример кода:
@XmlRootElement(name = "field")
@XmlAccessorType(XmlAccessType.FIELD)
public class Field {
@XmlAttribute(name="attribute1")
String attribute1;
@XmlAttribute(name="attribute2")
String attribute2;
@XmlAttribute(name="attribute3")
String attribute3;
@XmlAnyAttribute
Map<String, String> attributes;
}
Тестовое задание
String xml = "<field attribute1=\"A\"" +
" attribute2=\"B\"" +
" attribute3=\"C\"" +
" attribute4=\"D\"" +
" foo=\"Bar\" />";
JAXBContext jaxbContext = JAXBContext.newInstance(Field.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Field field = (Field) unmarshaller.unmarshal(new StringReader(xml));
System.out.println("field.attribute1 = " + field.attribute1);
System.out.println("field.attribute2 = " + field.attribute2);
System.out.println("field.attribute3 = " + field.attribute3);
System.out.println("field.attributes = " + field.attributes);
Выход
field.attribute1 = A
field.attribute2 = B
field.attribute3 = C
field.attributes = {attribute4=D, foo=Bar}
Как видите, два "лишних" атрибута были добавлены на карту.
Если вы запускаете тот же тест, но без каких-либо атрибутов, т.е. с xml = "<field/>";
, ты получаешь:
field.attribute1 = null
field.attribute2 = null
field.attribute3 = null
field.attributes = null
attributes
поле не занято, т.е. null
, Это не пустая карта.