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

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

1. 主函数
[code] 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);
}

[/code]

2. 利用XPath获得节点信息
[code]
/**
* 利用反射机制实现的 将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();
}

}
[/code]

3. 反射机制实现set方法的动态调用
[code]
/**
* 输入: 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();
}
}
}
}
}
[/code]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值