当前位置:首页 > 开发 > 编程语言 > XML > 正文

Java通过反射以及Annotation将类对象写入XML文件中。

发表于: 2013-10-28   作者:alleni123   来源:转载   浏览次数:
摘要: 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; impo
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通过反射以及Annotation将类对象写入XML文件中。

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
private void btnWrite_Click(object sender, EventArgs e) { if (txtName.Text.Trim().Length == 0
关注微信号:javalearns 随时随地学Java 或扫一扫 随时随地学Java 创建一个自定义的Annotation impo
1. 前言 很多人都在使用myEclipse,很多公司也都使用hibernate框架,老版本的hibernate中,由于没有
Java 反射是 Java 语言的一个很重要的特征。 它允许运行中的 Java 程序对自身进行检查,并能直接操
Java 反射是 Java 语言的一个很重要的特征。 它允许运行中的 Java 程序对自身进行检查,并能直接操
Java 反射是 Java 语言的一个很重要的特征。 它允许运行中的 Java 程序对自身进行检查,并能直接操
Java 反射是 Java 语言的一个很重要的特征。 它允许运行中的 Java 程序对自身进行检查,并能直接操
Java 反射是 Java 语言的一个很重要的特征。 它允许运行中的 Java 程序对自身进行检查,并能直接操
JAVA中类文件加载是动态的。JVM指令是被封装在了. class文件里面,而.class文件的加载过程是动态的
JAVA中类文件加载是动态的。JVM指令是被封装在了. class文件里面,而.class文件的加载过程是动态的
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号