`

增加转换Pojo对象到XML文件的辅助器PojoToXMLHelper -- 使用标准输出重定向

阅读更多

因为设想每个表中存储的对象其实是一个POJO对象,这个表的结构就是这个pojo类,增加这个功能的目的是作为方便数据传输来使用的,可以将每个pojo类存贮成 该类的全名+".xml" 后缀的形式.

 

也想过使用dom4j, 但是主要是学习JAVA基础,不想过多的引入外部包,尽量使用JDK自带的功能.

最简单的 其实就是输出重定向的实现XML写入.

 

package cn.iamsese.prj.db.helper;

import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.lang.reflect.Field;

/**
 * JAVA Pojo类转成XML文档的辅助器
 * cn.iamsese.prj.db.helper
 * 下午03:11:34
 * @author vb2005xu [JAVA菜鸟]
 */
public class PojoToXMLHelper {
	private PojoToXMLHelper(){
	}
	
	/** PojoToXMLHelper 静态对象*/
	private static PojoToXMLHelper defaultPojoToXMLHelper ;
	/**
	 * 返回 PojoToXMLHelper 类的 单态实例
	 * @return PojoToXMLHelper
	 */
	public static synchronized PojoToXMLHelper getDefaultPojoToXMLHelper(){		
		if (defaultPojoToXMLHelper == null)
			return new PojoToXMLHelper();
		return defaultPojoToXMLHelper ;
	} 
	
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		UserExtendInfoTest testUser = new UserExtendInfoTest();
		testUser.setMobilePhone("1234");
		PojoToXMLHelper.getDefaultPojoToXMLHelper().tranlate(testUser);
		PojoToXMLHelper.getDefaultPojoToXMLHelper().tranlate(new cn.iamsese.prj.db.core.table.USER_Table());

	}
	
	/**
	 * 转换操作实现
	 * @param obj
	 */
	public void tranlate(Object obj){
		String fileName = MyReflectionHelper.getClassName(obj) + ".xml" ;
		
		PrintStream pout = null ;
		try {
			pout = new PrintStream(fileName);
		} catch (FileNotFoundException e) {
			//记录到日志中 -- 尚未实现
			System.out.println("不能创建文件流");
			e.printStackTrace();
		} 
		//重定向默认的标准I/O
		System.setOut(pout);
		System.out.println("<?xml version='1.0' encoding='UTF-8'?>");
		System.out.println("<properties>");
		//
		Field[] fieldArray = obj.getClass().getDeclaredFields();
		for(Field field : fieldArray) {   
            String name = field.getName();   
            //将首字母大写   
            name = name.substring(0, 1).toUpperCase()+name.substring(1);   
            //禁止Java访问权限检查,使能够访问private修饰的属性变量   
            field.setAccessible(true);
            Object text = MyReflectionHelper.getFieldValue(obj, field);
            System.out.println("<"+name+">" + text + "</"+name+">");
        }
		System.out.println("</properties>");
		if (pout != null){
			pout.close();
		}
	}

}
class UserExtendInfoTest {      
    private String userName;   
       
    private String mobilePhone;   
       
    public String getUserName() {   
        return userName;   
    }   
    public void setUserName(String userName) {   
        this.userName = userName;   
    }   
    public String getMobilePhone() {   
        return mobilePhone;   
    }   
    public void setMobilePhone(String mobilePhone) {   
        this.mobilePhone = mobilePhone;   
    }   
} 

 所依赖的自定义的反射类MyReflectionHelper是我自定义的,功能尚显不足.

package cn.iamsese.prj.db.helper;

import java.lang.reflect.Field;

/**
 * 自定义的反射工具封装类 cn.iamsese.prj.db.helper 
 * Author: vb2005xu [JAVA菜鸟]
 */
public class MyReflectionHelper {

	/**
	 * 返回指定对象的类全称[包括包名]
	 * 支持传入这样的参数: JDKLoggerHelper.class
	 * @param o
	 * @return className
	 */
	public static String getClassName(Object o) {
		if (o == null)
			throw new NullPointerException("传入的对象为null " + o);
		String className = o.getClass().getName();
		return className;
	}
	

	/* -------- 与 类属性相关的[现在定义的方法只能输出类自身的属性,不包括继承来的属性] --------- **/	
	
	/**
	 * 返回指定对象的的指定字段
	 * 
	 * @param owner
	 * @param fieldName
	 * @return Field
	 */
	public static Field getField(Object owner, String fieldName) {
		Field f = null;
		try {
			f = owner.getClass().getDeclaredField(fieldName);
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		}
		return f;
	}

	/**
	 * 设置指定对象的指定字段的值
	 * @param owner
	 * @param tf
	 * @param value
	 */
	public static void setField(Object owner, Field tf, Object value) {
		try {
			tf.set(owner, value);
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 设置指定对象的指定字段的值
	 * @param owner
	 * @param fieldName
	 * @param value
	 */
	public static void setField(Object owner, String fieldName, Object value) {
		Field f = getField(owner, fieldName);
		setField(owner, f, value);// 调用上边的那个此函数的另一种多态形式
	}
	
	/**
	 * 返回指定对象的指定字段的值
	 * @param owner
	 * @param tf
	 * @return Object
	 */
	public static Object getFieldValue(Object owner, Field tf) {
		Object v = null;
		try {
			v = tf.get(owner);
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		return v;
	}
	/**
	 * 返回指定对象的指定字段的值
	 * @param owner
	 * @param fieldName
	 * @return Object
	 */
	public static Object getFieldValue(Object owner, String fieldName) {
		Field f = getField(owner, fieldName);
		return getFieldValue(owner, f);// 调用上边的那个此函数的另一种多态形式
	}
	
	/**
	 * 命令行输出指定对象,指定属性的值
	 * @param owner
	 * @param f
	 */
	public static void printFieldValue(Object owner, Field f) {
		System.out.println(getFieldValue(owner, f));
	}
	/**
	 * 命令行输出指定对象,指定属性的值
	 * @param owner
	 * @param fieldName
	 */
	public static void printFieldValue(Object owner, String fieldName) {
		System.out.println(getFieldValue(owner, fieldName));
	}
	
	public static void printFieldInfo(Object owner, Field f) {
		StringBuffer sbuf = new StringBuffer();
		sbuf.append("**当前字段信息 [开始]**\n");
		sbuf.append("Field name: " + f.getName());
		sbuf.append("\n");
		sbuf.append("Field type: " + f.getType().getName());
		sbuf.append("\n");
		sbuf.append("Field value: " + getFieldValue(owner, f));
		sbuf.append("\n");
		sbuf.append("**当前字段信息 [结束]**\n");

		System.out.println(sbuf.toString());
	}

	public static void printFieldInfo(Object owner, String fieldName) {
		Field f = getField(owner, fieldName);
		printFieldInfo(owner, f);
	}

	public static void printObjectFieldsInfo(Object owner) {
		System.out.println("+++++" + owner.getClass().getName() + "++++开始\n");
		Field[] fields = owner.getClass().getDeclaredFields();
		for (Field field : fields) {
			printFieldInfo(owner, field);
		}
		System.out.println("+++++" + owner.getClass().getName() + "++++结束");
	}

	public String toString() {
		return "自定义的反射工具封装类";
	}
}

 

USER_Table.JAVA这个文件,见这个系列的前一篇文章的附件

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics