`
VerRan
  • 浏览: 451112 次
  • 性别: Icon_minigender_1
  • 来自: 陕西.西安
社区版块
存档分类
最新评论

利用反射机制动态将XML信息设置入对象

XML 
阅读更多
引言:XML和J2EE密切的程度是不用说的了,由于我们的接口程序需要将别人发过来的XML文档信息进行处理,并持久化到数据库中。由于业务的不同,xml的格式也有所不同,不过执行的过程都是类似的,我们获得xml字符串信息并解析我们需要的信息,将这些信息持久化就ok了,这里存在的问题是随着业务的不同,xml格式不同需要将xml中的信息首先保存到不同的vo中,然后将vo持久化。这样反射机制就起了很大的作用。

1. 主函数
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		PaserXML p=new PaserXML();
        String xml="<?xml version='1.0' encoding='UTF-8'?> <root><Customer><id>1</id><name>ddd</name></Customer>"+
"<order><orderId>2</orderId><orderName>nnmnmnmn</orderName></order></root>";

    	p.parserByXpath2(xml);
	}



2. 利用XPath获得节点信息
	/**
	 *  利用反射机制实现的 将xml中的相关信息付给Vo
	 *  输入:String XML
	 *  返回: void
	 *  执行中---将XML数据 付给对应的VO :这里需要对命名进行规范
	 * */
	
	public void parserByXpath2(String xml){
		
		 try {
		        Reader in=new StringReader(xml);
				Document document=builder.build(in);
				Element root=document.getRootElement();
//				System.out.println(root.getName());
				Element o=(Element)org.jdom.xpath.XPath.selectSingleNode(root, "/root/order");
				OrderVO vo=new OrderVO();
				this.ElementTOVO(o, vo);//真正执行将通过Xpath解析出来的节点下的 信息  付给 VO
				System.out.println("vo.getOrderId()"+vo.getOrderId());
				System.out.println("vo.getOrderName()"+vo.getOrderName());
			} catch (JDOMException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		
	}


3. 反射机制实现set方法的动态调用
/**
	 * 输入: Element 利用Xpath解析出来要做处理的 Docuemnt 文档树中的阶段信息
	 * 输出: Void
	 * 思路: 读取XML文件中要做处理的值信息,将值赋给相应的VO的字段,这里需要调用其set方法实现
	 *       由于不同的VO会有不同数量,不同值得字段和set方法,这里采用反射机制.
	 *       
	 *       
	 * */
public void ElementTOVO(Element e,Object vo){
			
		Class clazz=vo.getClass();
		Field fd=null;
		Method m=null;
		Class fType=null;
		String fName="";
		Element element=null;
		String xmlValue="";
java.lang.reflect.Method[] method=clazz.getDeclaredMethods();//获得所有的声明方法
				java.lang.reflect.Field[] field=clazz.getDeclaredFields();//获得所有的声明字段
				for(int i=0;i<field.length;i++){
					fd=field[i];
					fName=fd.getName();// 获得字段的名称
					fType=fd.getType();// 获得字段的类型
					if("java.lang.String".equals(fType.getName())){//判断字段类型是否为String型,由于这里需要利用反射机制调用方法而且为了统一实现
						//将VO中的字段都定义为String 型
						element=e.getChild(fName);//获得e(即传过来的Element)下的制定名称的Element fName 
						if(element==null){
							xmlValue=null;
						}
						else{
							xmlValue=element.getValue();//获得指定元素下的值信息
						}
						fName=fName.substring(0,1).toUpperCase()+fName.substring(1,fName.length());//由于属性名第一个字母为小写
						//为了调用set方法,将第一个字母大写 以便构造set方法名。 比如 orderId--->OrderId---->setOrderId
						if(fName!=null){//如果方法名存在
							try {
								m=clazz.getMethod("set"+fName, new Class[]{fType});//通过方法名获得 指定的方法参数类型 比如String
								//第一个参数指定要调用方法的名称、第二个指定调用方法的参数类型
							} catch (SecurityException e1) {
								// TODO Auto-generated catch block
								e1.printStackTrace();
							} catch (NoSuchMethodException e1) {
								// TODO Auto-generated catch block
								e1.printStackTrace();
							}
						}
						if(xmlValue!=null){
							try {
								System.out.println(xmlValue);
								m.invoke(vo, new Object[]{xmlValue});//调用动态生成的方法
								//参数一指定方法所在的类,参数二制定 参数的值
							} catch (IllegalArgumentException e1) {
								// TODO Auto-generated catch block
								e1.printStackTrace();
							} catch (IllegalAccessException e1) {
								// TODO Auto-generated catch block
								e1.printStackTrace();
							} catch (InvocationTargetException e1) {
								// TODO Auto-generated catch block
								e1.printStackTrace();
							}
						}
					}
				}
			}
分享到:
评论

相关推荐

    XML解析与反射应用联合.zip

    XML解析与反射机制的初步应用,里面包含了XML解析工具的使用,以及反射机制执行XML文档所描述的未来定义类的方法调用!

    基于Java的XML解析与反射设计模式.doc

    基于Java的XML解析与反射设计模式 摘要:随着计算机时代的蓬勃发展,internet的普及给社会以及人民的生活带来了巨 大的影响。与此同时,b/s结构的多系统相互访问技术应时代的发展也如雨后春笋般不断 涌现出来,相应...

    jumeIOC:基于xml配置的IOC容器、对对象进行统一管理

    自己写IOC容器、不是闲着没事、而是深入理解IOC容器的实现方式、用到的技术点 dom4j解析xml文件、利用反射机制创建对象、使用Map集合作为容器、xml中配置的id 对应Map的key、value对应一个对象。主要学习思想、注解...

    Spring面试题

    一个配置好的ActionForm对象被创建,并被填入表单相应的数据,ActionServler根据Struts-config.xml文件配置好的设置决定是否需要表单验证,如果需要就调用ActionForm的 Validate()验证后选择将请求发送到哪个...

    JavaScript王者归来part.1 总数2

     7.2.3 反射机制--枚举对象属性   7.3 对象的构造   7.3.1 构造函数--一个双精度浮点数封装类的例子   7.3.2 缺省构造和拷贝构造   7.3.3 对象常量   7.4 对象的销毁和存储单元的回收   7.5 JavaScript...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     B.2 运用反射机制来持久化Java对象 附录C 用XDoclet工具生成映射文件  C.1 创建带有@hibernate标记的Java源文件  C.2 建立项目的目录结构  C.3 运行XDoclet工具 附录D 发布和运行netstore应用  D.1 运行...

    JAVA_API1.6文档(中文)

    java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java....

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     B.2 运用反射机制来持久化Java对象 附录C 用XDoclet工具生成映射文件  C.1 创建带有@hibernate标记的Java源文件  C.2 建立项目的目录结构  C.3 运行XDoclet工具 附录D 发布和运行netstore应用  D.1 运行...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     B.2 运用反射机制来持久化Java对象 附录C 用XDoclet工具生成映射文件  C.1 创建带有@hibernate标记的Java源文件  C.2 建立项目的目录结构  C.3 运行XDoclet工具 附录D 发布和运行netstore应用  D.1 运行...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     B.2 运用反射机制来持久化Java对象 附录C 用XDoclet工具生成映射文件  C.1 创建带有@hibernate标记的Java源文件  C.2 建立项目的目录结构  C.3 运行XDoclet工具 附录D 发布和运行netstore应用  D.1 运行...

    asp.net知识库

    在Asp.net中如何用SQLDMO来获取SQL Server中的对象信息 使用Relations建立表之间的关系并却使用PagedDataSource类对DataList进行分页 通过作业,定时同步两个数据库 SQLSERVER高级注入技巧 利用反射实现ASP.NET控件和...

    Spring.net框架

    t.InvokeMember(prop.propertyName, ........BindingFlags.SetProperty, null, o, new Object[] {p})利用反射机制对创建出来的对象设置属性值。 我们的Factory就是利用这种方式根据配置文件动态加载程序集,动态创建...

    java api最新7.0

    java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java.nio ...

    JavaAPI1.6中文chm文档 part1

    java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java....

    [Java参考文档]

    java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java....

    JavaAPI中文chm文档 part2

    java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java....

    [Java参考文档].JDK_API 1.6

    java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java.nio ...

Global site tag (gtag.js) - Google Analytics