package com.lj.test;
import java.io.File;
import java.io.FileWriter;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import com.lj.annotation.NodeAnnotation;
import com.lj.model.Person;
public class WriteRef
{
public static void main(String[] args) throws Exception
{
Person p1 = new Person("li", "233", 25);
Person p2 = new Person("wu", "123", 27);
List<Person> al = new ArrayList<Person>();
al.add(p1);
al.add(p2);
Document doc = DocumentHelper.createDocument();
doc = writeList2XML(doc, al);
XMLWriter writer=new XMLWriter(new FileWriter(new File("src/main/resources/Person.xml")),OutputFormat.createPrettyPrint());
writer.write(doc);
writer.flush();
writer.close();
}
@SuppressWarnings({ "rawtypes", "unchecked" })
private static Document writeList2XML(Document doc, List<?> objs)
throws Exception
{
String temp_name = objs.get(0).getClass().getSimpleName();
String firstLetter = temp_name.substring(0, 1).toLowerCase();
String objName = firstLetter
+ temp_name.substring(1, temp_name.length());
String rootName = objName + "s";
// xml文件的跟目录名称
System.out.println("objname= " + objName);
Element root = doc.addElement(rootName);
Class clz = objs.get(0).getClass();
Field[] fields = clz.getDeclaredFields();
for (Object obj : objs)
{
Element ele = root.addElement(objName);
for (Field f : fields)
{
//类属性名称, 用于获取getter和setter
String name = f.getName();
String firstLetter_ = name.substring(0, 1).toUpperCase();
System.out.println(name);
String getMethodName = "get" + firstLetter_
+ name.substring(1, name.length());
Method getMethod = clz.getMethod(getMethodName, new Class[] {});
Object valueObj = getMethod.invoke(obj, new Class[] {});
String value = valueObj.toString();
System.out.println("value= " + value);
//检查get方法是否包含注释
if (getMethod.isAnnotationPresent(NodeAnnotation.class))
{
String nodeName = getMethod.getAnnotation(
NodeAnnotation.class).nodeName();
System.out.println("nodeName= -----------" + nodeName);
ele.addElement(nodeName).addText(value);
} else {
ele.addElement(name).addText(value);
}
if (name.equals("id"))
{
System.out.println("***********id=" + value + "********");
ele.addAttribute(name, value);
}
}
}
return doc;
}
}
这里用到了反射以及注释。
注释的作用是将英文的对象名称转换成中文, 存储在xml文件中。
比如我在Person类中有一个password,但是我想在xml文件中以‘密码’作为节点名称。
那么就通过注释来获取。
在Person类中的代码为:
package com.lj.model;
import com.lj.annotation.NodeAnnotation;
public class Person
{
private String name;
private String password;
private int age;
@NodeAnnotation(nodeName = "名字")
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
@NodeAnnotation(nodeName = "密码")
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
public Person(String name, String password, int age)
{
super();
this.name = name;
this.password = password;
this.age = age;
}
}
分享到:
相关推荐
java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java....
java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java.nio ...
通过这个示例,你可以了解到如何将Java对象转换为Excel表格,以及如何利用反射和注解来增强代码的灵活性和可扩展性。这在实际开发中非常有用,特别是在需要动态生成或解析不同结构数据的情况下。
在Java编程中,元数据(Metadata)是指关于数据的数据,它提供有关文件、数据库记录、类、方法等的附加信息,但不直接构成这些实体的实际内容。元数据可以帮助理解和处理这些对象,例如,图片的元数据可能包含拍摄...
3. **序列化**:使用XML序列化库,将业务对象转换为XML字符串或写入XML文件。 4. **反序列化**:读取XML文件或字符串,使用反序列化库恢复为对象实例。 5. **验证和错误处理**:确保序列化后的XML符合预期格式,并...
本篇文章将详细解析Java中常用的工具类,包括字符处理、文件处理、时间操作以及图片处理等方面的知识点。 1. **字符处理**: - `java.lang.String`:String类是Java中最基础也是最常用的数据类型之一,提供了大量...
java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java.nio ...
java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java....
java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java....
11. **XML处理**:包括DOM(文档对象模型)、SAX(简单API for XML)和StAX(流式API for XML)解析器,用于读取、写入和操作XML文档。 12. **GUI编程**:Java Swing和JavaFX用于构建桌面应用程序的图形用户界面,...
java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java....
这部分将讲解如何使用反射来动态地创建对象,调用方法,以及访问私有成员。 7. **注解(Annotation)**:注解是一种元数据,可以为编译器、JVM或工具提供信息。书中会讨论注解的定义、使用,以及如何编写自定义注解...
java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java.nio ...
2. **类与对象**:在Java中,一切皆为对象。类是创建对象的模板,包含数据(属性)和行为(方法)。理解类的封装、继承和多态性是Java面向对象编程的核心。 3. **异常处理**:Java的异常处理机制使得程序在遇到错误...
Java I/O流处理允许程序读取和写入数据,无论是文件系统还是网络连接。输入输出流分为字节流和字符流,还有缓冲流、转换流和对象序列化等高级特性,为高效的数据传输提供了可能。 Java还包含丰富的标准库,如 Swing...
77.JSON处理:示例可能涵盖使用Gson或Jackson库将Java对象转换为JSON字符串,以及反序列化回Java对象。 78.XML处理:DOM、SAX和StaX API可用于解析和生成XML文档,示例可能涵盖这些API的使用。 79.图形绘制:Java...
在Java编程语言中,"常用操作"涵盖了许多方面,包括对象创建、数据类型处理、集合框架、异常处理、输入输出(I/O)、多线程、网络编程、反射、注解等。以下是一些核心知识点的详细说明: 1. **对象与类**: - **类与...