应用java反射机制将一个xml文件注入到与其对应的java类中Word文档格式.docx
《应用java反射机制将一个xml文件注入到与其对应的java类中Word文档格式.docx》由会员分享,可在线阅读,更多相关《应用java反射机制将一个xml文件注入到与其对应的java类中Word文档格式.docx(8页珍藏版)》请在冰点文库上搜索。
importcn.yunweb.weather.util.XMLUtil;
publicclassXMLBeanUtil{
/**
*将xml文档中的一个节点注入到与之对应的XMLBean对象中
*@paramo对应节点类
*@parameXml文档节点
*@throwsException
*/
privatestaticvoidinjectNodeToXMLBean(Objecto,Nodee)
{
//1)注入属性值
injectAttributes(o,e);
//2)注入节点-------只处理元素型子节点或仅有一个文本型子节点的情况(其他情况忽略)
NodeListchildNodes=e.getChildNodes();
//得到文本子节点
ArrayList<
Node>
tl=newArrayList<
();
for(inti=0;
i<
childNodes.getLength();
i++)
if(childNodes.item(i).getNodeType()==Node.TEXT_NODE)
tl.add(childNodes.item(i));
}
//得到元素子节点
nl=newArrayList<
if(childNodes.item(i).getNodeType()==Node.ELEMENT_NODE)
nl.add(childNodes.item(i));
//2.1处理文本型子节点(若没有元素子节点而且只有一个文本子节点时才给nodeText赋值)
if(nl.size()==0&
&
tl.size()==1)
StringfieldName="
nodeText"
;
StringfieldValue=tl.get(0).getNodeValue();
try{
Fieldfield=o.getClass().getDeclaredField(fieldName);
field.set(o,fieldValue);
}catch(Exceptionee){
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));
//2.2.2元素相同
if(nl.get(0).getNodeName().equals(nl.get
(1).getNodeName()))//只用判断前两个元素名是否相同就行
injectArrayField(o,nl);
}else{
//2.2.3元素互不相同
nl.size();
injectSingleObjectField(o,nl.get(i));
*给节点属性对应的成员变量进行注入
*@paramattrField拥有这些属性的节点对应的成员对象
*@paramnode与该对象对应的节点
privatestaticvoidinjectAttributes(ObjectattrField,Nodenode){
//得到节点的属性节点
NamedNodeMapattrs=node.getAttributes();
ClassthisClass=attrField.getClass();
attrs.getLength();
StringfieldName=attrs.item(i).getNodeName();
StringfieldValue=attrs.item(i).getNodeValue();
Fieldfield=thisClass.getDeclaredField(fieldName);
field.set(attrField,fieldValue);
//System.out.println("
属性:
注入成功"
+attrField.getClass().getName()+"
"
*给单个对象的成员变量进行注入
*@paramsingleField要注入的成员变量对象
privatestaticvoidinjectSingleObjectField(ObjectsingleField,Nodenode)
//得到该元素的对应类名
StringfieldName=node.getNodeName();
ClassfieldClass=null;
StringclassName=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);
+singleField.getClass().getName()+"
*给数组型的成员变量进行注入
*@paramarrayField要注入的数组成员变量对象
*@paramnodeList该数组对象中的所有对象对应的节点列表
privatestaticvoidinjectArrayField(Object
arrayField,ArrayList<
nodeList)
StringfieldName=nodeList.get(0).getNodeName();
field=arrayField.getClass().getDeclaredField(fieldName);
ClasscomponentType=fieldClass.getComponentType();
//去掉数组型的前两个字符"
[L"
可以得到数组中元素的类名和最后的”;
“号
className=fieldClass.getName().substring
(2).replace("
"
sub=java.lang.reflect.Array.newInstance(componentType,
nodeList.size());
nodeList.size();
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);
+arrayField.getClass().getName()+"
ee.printStackTrace();
*把指定文件中的数据初始化到对象中
*@paramdata与该文件关联的XMLBean对象
*@paramfilenamexml文件名
publicstaticsynchronizedvoidinitXMLBean(XMLBeandata)
longlasttime=newFile(data.xmlFile).lastModified();
if(data.lastModified!
=lasttime)
Documentdoc=XMLUtil.readXMLFile(data.xmlFile);
Elementreal_dataNode=doc.getDocumentElement();
XMLBeanUtil.injectNodeToXMLBean(data,real_dataNode);
}catch(Exceptione){
e.printStackTrace();
XMLBean:
+data.getClass()+"
["
+data+"
]已经更新..."
data.lastModified=lasttime;