




全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
应用java反射机制将一个xml文件注入到与其对应的java类中前两篇文档中我已经分别贴了怎样由xml文件自动生成与之对应的java类和怎样将一个java对象打印出来的源码,下面我再把怎样将xml文件中的值注入到前面生成的java类的对象中的源码贴上,三部分源码都有了,加于适当修改,那么对日后的开发将会非常方便。其中import cn.yunweb.weather.util.XMLUtil;这个类在前两篇中已经贴出过。源码如下:import java.io.File;import java.lang.reflect.Field;import java.util.ArrayList;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NamedNodeMap;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import cn.yunweb.weather.bean.xmlbean.XMLBean;import cn.yunweb.weather.util.XMLUtil;public class XMLBeanUtil /* * 将xml文档中的一个节点注入到与之对应的XMLBean对象中 * param o对应节点类 * param eXml文档节点 * throws Exception */private static void injectNodeToXMLBean(Object o,Node e)/1)注入属性值injectAttributes(o,e);/2)注入节点-只处理元素型子节点或仅有一个文本型子节点的情况(其他情况忽略)NodeList childNodes=e.getChildNodes();/得到文本子节点ArrayList tl=new ArrayList();for(int i=0;ichildNodes.getLength();i+)if(childNodes.item(i).getNodeType()=Node.TEXT_NODE)tl.add(childNodes.item(i);/得到元素子节点ArrayList nl=new ArrayList();for(int i=0;ichildNodes.getLength();i+)if(childNodes.item(i).getNodeType()=Node.ELEMENT_NODE)nl.add(childNodes.item(i);/2.1处理文本型子节点(若没有元素子节点而且只有一个文本子节点时才给nodeText赋值)if(nl.size()=0&tl.size()=1)String fieldName=nodeText;String fieldValue=tl.get(0).getNodeValue();tryField field=o.getClass().getDeclaredField(fieldName);field.set(o, fieldValue);catch (Exception ee) System.out.println(类:+o.getClass().getName()+中没有属性(+fieldName+)或赋值错误!);if(nl.size()1)return;/2.2处理元素型子节点/*分为元素唯一、元素互相不同、元素相同三种情况 *注意:不考虑元素型子节点中既有同名节点又有不同名节点的情况 *这种情况将不能正确的给对象进行注入 * */2.2.1元素唯一if(nl.size()=1)injectSingleObjectField(o, nl.get(0);return;/2.2.2元素相同if(nl.get(0).getNodeName().equals(nl.get(1).getNodeName()/只用判断前两个元素名是否相同就行injectArrayField(o, nl);else/2.2.3元素互不相同for(int i=0;inl.size();i+)injectSingleObjectField(o,nl.get(i);/* * 给节点属性对应的成员变量进行注入 * param attrField拥有这些属性的节点对应的成员对象 * param node与该对象对应的节点 */private static void injectAttributes(Object attrField,Node node)/得到节点的属性节点NamedNodeMap attrs = node.getAttributes();Class thisClass=attrField.getClass();for(int i=0;iattrs.getLength();i+)String fieldName=attrs.item(i).getNodeName();String fieldValue=attrs.item(i).getNodeValue();tryField field=thisClass.getDeclaredField(fieldName);field.set(attrField, fieldValue);/System.out.println(属性:+fieldName+注入成功);catch (Exception ee) System.out.println(类:+attrField.getClass().getName()+中没有属性(+fieldName+)或赋值错误!);/* * 给单个对象的成员变量进行注入 * param singleField要注入的成员变量对象 * param node与该对象对应的节点 */private static void injectSingleObjectField(Object singleField,Node node)/得到该元素的对应类名String fieldName=node.getNodeName();tryClass fieldClass=null;String className=null;Field field=singleField.getClass().getDeclaredField(fieldName);fieldClass=field.getType();className=fieldClass.getName();Object subObject=Class.forName(className).getConstructors()0.newInstance(singleField);field.set(singleField, subObject);XMLBeanUtil.injectNodeToXMLBean(subObject, node);catch (Exception ee) System.out.println(类:+singleField.getClass().getName()+中没有属性(+fieldName+)或赋值错误!);/* * 给数组型的成员变量进行注入 * param arrayField要注入的数组成员变量对象 * param nodeList该数组对象中的所有对象对应的节点列表 */private static void injectArrayField(Object arrayField,ArrayList nodeList)String fieldName=nodeList.get(0).getNodeName();tryClass fieldClass=null;String className=null;Field field=arrayField.getClass().getDeclaredField(fieldName);fieldClass=field.getType();Class componentType=fieldClass.getComponentType();/去掉数组型的前两个字符L可以得到数组中元素的类名和最后的”;“号className=fieldClass.getName().substring(2).replace(;, );Object sub=java.lang.reflect.Array.newInstance(componentType, nodeList.size();for(int i=0;inodeList.size();i+)Object oi=Class.forName(className).getConstructors()0.newInstance(arrayField);java.lang.reflect.Array.set(sub,i,oi );XMLBeanUtil.injectNodeToXMLBean(oi, nodeList.get(i);field.set(arrayField,sub);catch (Exception ee) System.out.println(类:+arrayField.getClass().getName()+中没有属性(+fieldName+)或赋值错误!);ee.printStackTrace();/* * 把指定文件中的数据初始化到对象中 * param data与该文件关联的XMLBean对象 * param filenamexml文件名 */public static synchronized void initXMLBean(XMLBean data)long lasttime=new File(data.xmlFile).lastModified();if(data.lastModified!=lasttime)tryDocument doc =XMLUtil.readXMLFile(data.xmlFile);Eleme
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2022圣诞节气氛感言(8篇)
- 老旧停车场智能化改造可行性研究报告(参考模板)
- 五以内的加法大班教学
- 年货促销策划方案
- 初创公司股权设计
- 河南司法警官职业学院《大数据平台及应用》2023-2024学年第二学期期末试卷
- 广西体育高等专科学校《土建工程基础》2023-2024学年第二学期期末试卷
- 福州科技职业技术学院《虚拟仪器技术》2023-2024学年第二学期期末试卷
- 江苏理工学院《电气检测技术》2023-2024学年第二学期期末试卷
- 安徽扬子职业技术学院《法律文献检索》2023-2024学年第二学期期末试卷
- 线性代数中向量空间的概念与应用:课件
- 2025年小学教师资格考试《综合素质》文化素养高频考点专项练习及答案
- (三模)温州市2025届高三第三次适应性考试语文试卷
- 《危险化学品企业安全生产标准化规范》专业深度解读与应用培训指导材料之5:5管理要求-5.5 安全风险管理和双重预防机制建设(雷泽佳编制-2025A0)
- 2025年二级注册建筑师《建筑经济、施工与设计业务管理》考试真题卷(附解析)
- 铁塔施工安装技术方案
- 2025陕西烟草专卖局招聘42人易考易错模拟试题(共500题)试卷后附参考答案
- 2025年中国农化产品市场调查研究报告
- 光谱分析在大气污染物成分识别中的应用研究
- 2025年高中生物学业水平考试知识点归纳总结(复习必背)
- 野生菌蘑菇的试题及答案
评论
0/150
提交评论