Java通过反射以及Annotation将类对象写入XML文件中。_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Java通过反射以及Annotation将类对象写入XML文件中。

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

 2013/10/28 21:57:40  alleni123  程序员俱乐部  我要评论(0)
  • 摘要:packagecom.lj.test;importjava.io.File;importjava.io.FileWriter;importjava.lang.reflect.Field;importjava.lang.reflect.Method;importjava.util.ArrayList;importjava.util.List;importorg.dom4j.Document;importorg.dom4j.DocumentHelper;importorg.dom4j
  • 标签:文件 not Java Annotation 反射 XML文件 XML
class="java" name="code">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;
	}
	
	
	
	
	
}





上一篇: WPF 自定义控件,在ViewModel里面获取自定义控件的值 下一篇: 没有下一篇了!
发表评论
用户名: 匿名