`

增加转换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这个文件,见这个系列的前一篇文章的附件

分享到:
评论

相关推荐

    使用PD(PowerDesigner)自动生成Hibernate的POJO文件及xml配置文件

    ### 使用PD(PowerDesigner)自动生成Hibernate的POJO文件及xml配置文件 #### 知识点解析 **一、Hibernate框架简介** Hibernate是一个强大的对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互。...

    使用MyEclipse工具生成POJO类和映射文件.hbm.xml

    使用 MyEclipse 工具生成 POJO 类和映射文件 .hbm.xml MyEclipse 是一款功能强大且流行的集成开发环境(IDE),它提供了许多实用的功能来帮助开发者快速开发应用程序。在本篇文章中,我们将学习如何使用 MyEclipse ...

    Feign发送Get请求时,采用POJO对象传递参数的最终解决方案.docx

    ### Feign发送Get请求时,采用POJO对象传递参数的最终解决方案 #### 前言 在Spring Cloud技术栈中,Feign作为一种声明式的HTTP客户端框架,极大地简化了微服务间的HTTP请求调用过程,使其几乎如同调用本地方法一般...

    Java的几种对象(PO-VO-DAO-BO-POJO)解释

    - **用途**:当需要将数据库中的数据转换为Java对象以便于处理时,就会使用到PO。 - **特点**: - 与数据库表结构相对应; - 不包含任何业务逻辑或数据操作行为。 #### 二、VO:Value Object(值对象) 值对象...

    用pojo对象作birt的数据源

    在BIRT中,数据源通常可以是数据库连接、XML文件、Web服务等。然而,当数据源为动态生成或者来自复杂的业务逻辑时,直接使用POJO对象作为数据源更为合适。这允许我们直接操作Java对象,避免了中间转换步骤,提高效率...

    mybatis自动生成dao pojo xml文件工具(mysql)

    4. **整合到项目中**:将生成的文件导入到项目中,配置MyBatis的SqlSessionFactory,然后就可以在业务逻辑中直接使用生成的DAO和POJO对象了。 MBG的灵活性体现在其高度可定制化,你可以自定义生成的类和XML文件的...

    mybatis自动生成dao pojo xml文件工具(SQL server)

    通过使用MyBatis的代码生成器,我们可以根据数据库表结构自动生成对应的DAO接口、实现类、POJO实体类以及对应的XML配置文件,大大减少了重复性工作。 首先,要使用MyBatis的代码生成器,你需要在项目中引入MyBatis...

    根据hibernate.cfg.xml文件生成POJO数据库表的工具类

    1. **解析XML配置文件**:使用Java的DOM或SAX解析器读取`hibernate.cfg.xml`,获取到所有`&lt;class&gt;`标签的相关信息。 2. **获取表名和字段信息**:从每个`&lt;class&gt;`标签中提取出表名,并通过JDBC连接查询数据库获取表...

    mybatis自动生成dao pojo xml文件 (mysql)

    4. **整合到项目**: 将生成的代码导入到项目中,配置MyBatis的主配置文件(`mybatis-config.xml`),添加Mapper接口和XML文件的路径。 5. **测试功能**: 编写单元测试或者集成测试,确保自动生成的代码能够正常工作...

    使用xstream解析xml,xml与pojo的双向转化,完整的java 工程

    本项目提供了一个完整的Java工程示例,演示了如何使用XStream实现XML到POJO以及POJO到XML的双向转化,并包含了必要的jar包和测试类,可以直接运行。 XStream是JVM平台上的一个开源库,由XStream Software公司开发,...

    Mybatis自动生成pojo、mapper、xml工具

    Mybatis 自动生成POJO(Plain Old Java Object)、Mapper以及对应的XML配置文件的工具,极大地提高了开发效率,避免了手动编写重复的代码。 POJOs是简单的Java对象,它们代表数据库表中的记录。在Mybatis中,我们...

    mybatis xml文件自动生成

    总的来说,MyBatis XML文件和POJO类的自动生成是一个实用的开发辅助功能,它提升了开发效率,减少了错误的可能性,同时也使得项目结构更加规范。在实际开发中,合理利用这类工具能够极大地提高开发团队的生产力。

    myeclipse中自动生成hibernate的POJO、DAO和hbm.xml文件

    MyEclipse中自动生成Hibernate的POJO、DAO和hbm.xml文件 MyEclipse是一款功能强大且流行的集成开发环境(IDE),它提供了许多实用的功能来帮助开发者快速构建和维护项目。其中,MyEclipse提供了对Hibernate的支持,...

    数据表生成pojo

    - Hibernate:在Hibernate中,POJO作为持久化对象,通过注解或XML配置与数据库表进行映射。查询时,Hibernate将SQL结果自动转化为POJO实例。 - MyBatis:MyBatis允许开发者自由编写SQL,将结果集映射到POJO,提供...

    parse xml string from url to POJO

    在Android开发中,有时我们需要从服务器获取XML格式的数据,并将其转换为对应的Java对象(POJO,Plain Old Java Object)。这个过程通常称为XML解析。在给定的场景中,"parse xml string from url to POJO"涉及到的...

    jackson-dataformat-xml:Jackson JSON处理器的扩展,增加了对将POJO序列化为XML(以及从XML反序列化)的支持,以替代JSON

    应该保证的是,使用此模块编写的任何XML也必须使用该模块可读:也就是说,我们的目标是进行完整的XML序列化。 从上面开始:有些XML构造模块将无法处理; 包括JAXB支持的某些情况 但是,此模块可能还支持JAXB无法...

    mybatis自动生成dao接口、pojo、mapper.xml

    这个压缩包文件“generator”很可能包含了一套MyBatis代码生成器的配置和脚本,用于自动生成DAO接口、POJO(Plain Old Java Object)类以及对应的Mapper XML文件。 首先,我们来了解一下DAO(Data Access Object)...

    Maven项目逆向生成工具 自动生成数据库表的pojo对象以及mapper文件 可以免费下载无需付费

    需要在项目pom文件的插件节点里面加上逆向生成插件 将配置文件放在项目根目录 &lt;!--mybatis逆向生成插件--&gt; &lt;groupId&gt;org.mybatis.generator &lt;artifactId&gt;mybatis-generator-maven-plugin &lt;version&gt;1.3.6 &lt;!--...

    Mybatis生成pojo插件

    Mybatis是一款广受欢迎的Java持久层框架,它简化了数据库操作与对象模型之间的映射,提供了灵活的SQL映射和基于XML或注解的配置方式。在开发过程中,经常需要手动创建POJO(Plain Old Java Object)类来作为数据表的...

    maven-guvnor-install-pojo-plugin-1.1.0.17-sources.jar

    maven-guvnor-install-pojo-plugin-1.1.0.17-sources.jar

Global site tag (gtag.js) - Google Analytics