有没有注解的方式
时间: 2024-02-23 11:02:20 浏览: 48
是的,我们也可以使用注解的方式来自动为Person对象的属性赋值。具体实现方式如下:
1.定义一个自定义注解@XmlElement,用于标识xml节点的属性名和属性类型
2.将@XmlElement注解加到Person类的属性上,指定属性名和属性类型
3.遍历Person类的每个属性,获取属性上的@XmlElement注解,根据注解指定的属性名从xml节点中获取属性值,并使用反射将属性值赋给Person对象的对应属性
下面是一个示例代码:
```
// 自定义注解,用于标识xml节点的属性名和属性类型
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface XmlElement {
String name(); // xml节点的属性名
Class<?> type(); // xml节点的属性类型
}
// Person类,使用@XmlElement注解标识属性名和属性类型
public class Person {
@XmlElement(name = "name", type = String.class)
private String name;
@XmlElement(name = "age", type = int.class)
private int age;
// getter和setter方法
}
// 解析xml文件生成对象的方法
public static List<Person> parseXml(String filePath) throws Exception {
List<Person> personList = new ArrayList<>();
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new File(filePath));
Element rootElement = document.getRootElement();
List<Element> personElements = rootElement.elements("person");
// 通过注解自动为Person对象赋值
for (Element personElement : personElements) {
Person person = new Person();
Field[] fields = person.getClass().getDeclaredFields();
for (Field field : fields) {
XmlElement xmlElement = field.getAnnotation(XmlElement.class);
if (xmlElement != null) {
String fieldName = xmlElement.name();
Class<?> fieldType = xmlElement.type();
String fieldValueStr = personElement.attributeValue(fieldName);
if (fieldValueStr != null) {
Object fieldValue = null;
if (fieldType == int.class) {
fieldValue = Integer.parseInt(fieldValueStr);
} else if (fieldType == double.class) {
fieldValue = Double.parseDouble(fieldValueStr);
} else if (fieldType == boolean.class) {
fieldValue = Boolean.parseBoolean(fieldValueStr);
} else if (fieldType == String.class) {
fieldValue = fieldValueStr;
}
field.setAccessible(true);
field.set(person, fieldValue);
}
}
}
personList.add(person);
}
return personList;
}
```
在上述示例代码中,我们定义了一个自定义注解@XmlElement,并将它加到Person类的属性上,用于标识xml节点的属性名和属性类型。在解析xml文件生成对象的方法中,我们遍历Person类的每个属性,获取属性上的@XmlElement注解,根据注解指定的属性名从xml节点中获取属性值,并使用反射将属性值赋给Person对象的对应属性。最后,我们将Person对象添加到personList中,并返回personList,即可得到解析后的结果。
阅读全文