您的位置:首页 > 大数据 > 物联网

物联网数据中心项目第四天

2020-07-12 17:21 176 查看

修改项目,添加配置模块,创建Main包,整理项目

1.通过dom4j解析xml文件
获取elements集合包含所有子元素,获取nodecount子元素的个数,手动遍历集合,分别赋值。

String… string为可变参数,在方法中表现为一个arrays数组,所以在遍历时正好可以通过控制参数i来获取string的第i个值
2.通过反射获取类镜像,并设置全局变量值。
使用反射获取类镜像,然后创建实例,获取field对象,修改实例的全局变量,用上面解析好的xml文件赋值。

(这是最初版,已舍弃)

public static Object getInstanceObject(String sonName,String... fieldName) {
// 获取所有的子元素
List<Element> elements = root.elements(sonName);
//子节点个数
int nodeCount = root.element(sonName).nodeCount();
System.out.println(nodeCount);
// 获取权限类名
String gatherClassPath = root.element(sonName).attributeValue("class");
// 要返回的对象
Object newInstance = null;
// 最终属性值
String elementTextTrim = null;

try {
Class<?> gatherClass = Class.forName(gatherClassPath);
newInstance = gatherClass.newInstance();
// 获取什么元素
for(int i=0;i<nodeCount;i++) {
for (Element element : elements) {
elementTextTrim = element.elementTextTrim(fieldName[i]);
Field field = gatherClass.getField(fieldName[i]);
field.set(newInstance, elementTextTrim);
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return newInstance;
}

这是第一版,与前几天没有创建实例并且没有给全局变量赋值,仅仅在各个类中读取子标签内容相比改良很多,但依旧有改进空间。

3.第二版(迭代器)
第二版实现一一对应,类似key-value键值对,只需传入一个参数表明想实例化的是哪个类,就可以返回这个类的实例。同时,该实例的所有需要用xml配置文件中的数据进行赋值的变量也已经全部赋值完毕,可以直接调用想调用的方法。

public static Object getInstanceObject(String sonName) {
// 获取权限类名
String gatherClassPath = root.element(sonName).attributeValue("class");
// 要返回的对象
Object newInstance = null;
// 要赋值的属性值
String elementTextTrim = null;
// 要赋值的属性名
String name =null;

try {
Class<?> gatherClass = Class.forName(gatherClassPath);
newInstance = gatherClass.newInstance();
// 遍历节点
for (Iterator it = root.element(sonName).elementIterator(); it.hasNext();) {
// 获取节点
Element element = (Element) it.next();
// 获取节点名
name = element.getName();
// 去掉空格,获取节点值
elementTextTrim = element.getTextTrim();
Field field = gatherClass.getField(name);
field.set(newInstance, elementTextTrim);
}

} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return newInstance;
}

在该方法中,先根据传入的参数,获取全限类型,直接创建实例,根据实例获取field对象。
然后遍用迭代器遍历需要用到的子标签,遍历的同时获取次级子标签名,次级子标签值,给当前这个实例的当前属性赋值。

4.创建Main包

删除所有非Main包中的类的main方法,靠main包中的ClientMain和ServerMain进行全部项目的开启。
最终测试结果
在入口类中,创建配置模块即可。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: