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

    xiaoxiao2022-06-30  93

    因为设想每个表中存储的对象其实是一个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这个文件,见这个系列的前一篇文章的附件

    PojoToXMLHelper运行结果.rar (438 Bytes)下载次数: 37
    转载请注明原文地址: https://ju.6miu.com/read-1126217.html

    最新回复(0)