项目介绍:使用java1.5的原生xml操作类实现 对象xml字符串的相互转化
项目分析:主要分为是三个部分
1、容器类:AbstractContainer
存储xml、object对象的数组集合,管理xml/object的添加、删除、获取等,添加xml/object的同时会自动相互转化成其它对象并存储到数组中
2、DomConfigurableXmlParser-->doParseXml:xlm字符串转换成object对象
a) 使用javax.xm.parsers、org.w3c.dom原生库将xml字符串转化成Element对象
1
2
3
4
DocumentBuilder dombuilder = domfac.newDocumentBuilder();
ByteArrayInputStream inputStream = new ByteArrayInputStream(xml.getBytes());
Document doc = dombuilder.parse(inputStream);
Element root = doc.getDocumentElement();
b) 通过循环Element对象+反射转换成object对象
3、AbstractXmlBuilder-->buildXml:object对象转化成xml字符串
方法是通过object每个属性的值拼接成xml字符串
项目特点
1、不使用任何第三方库实现xml和object对象的相互转换
2、可以处理普通类型、日期类型(可通过注解设定格式)、集合(如ArrayList、HashSet)
3、部分代码解析:
a) Date.class.isAssignableFrom(field.getType()
判断field.getType()会否是Date的子类型(isAssignableFrom关系:父-->子)
b) A instanceof B:判断A是否是B的实例
c)复杂类型的处理(复杂类型并且是iterable类型)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
else if (Reflects.isComplexType(field.getType()) Iterable.class.isAssignableFrom(field.getType())) {
//属性为复杂类型,且是可迭代的(如数组、list、set类型等)
Class iterableGenericType = Reflects.getArrayGenericType(field);
Iterable iterable = null;
if (List.class.isAssignableFrom(field.getType())) {
iterable = new ArrayList();
}//代码效果参考:http://www.ezhiqi.com/zx/art_5312.html
if (Set.class.isAssignableFrom(field.getType())) {
iterable = new HashSet();
}
NodeList iterableNodeList = node.getChildNodes();
for (int j = 0 ; j < iterableNodeList.getLength() ; j++) {
Node iterableNode = iterableNodeList.item(j);
if (iterableNode.getNodeType() != Node.ELEMENT_NODE) {
continue;
}
//iterable为ArrayList或则HashSet
if (List.class.isAssignableFrom(field.getType())) {
((List)iterable).add(parseRecursion(iterableGenericType, iterableNode));
}
if (Set.class.isAssignableFrom(field.getType())) {
((Set)iterable).add(parseRecursion(iterableGenericType, iterableNode));
}
}
field.set(object, iterable);
Reflects.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
public class Reflects {
private Reflects(){}
/
判断是否复杂类型,版本1.0.0不支持java.lang java.util java.sql包中的实体类
@param clazz
@return boolean
/
public static boolean isComplexType(Class clazz){
if ((clazz.getName().startsWith("java.lang.") || clazz.getName().startsWith("java.util.")
|| clazz.getName().startsWith("java.sql.")) !clazz.isArray() !Iterable.class.isAssignableFrom(clazz) ) {
return false;
}
return true;
}
/
是否含有属性
@param clazz
@return boolean
/
public static boolean hasField(Class clazz){
if (clazz.getDeclaredFields() == null || clazz.getDeclaredFields().length == 0) {
return false;
}
return true;
}
/
返回一个默认构造器产生的实例
@param clazz
@return object
@throws InstantiationException
@throws IllegalAccessException
/
public static T getInstance(Class clazz) throws InstantiationException, IllegalAccessException{
return clazz.newInstance();
}
/
获取数组属性中所持有的类型
@param field
@return class
/
public static Class getArrayGenericType(Field field){
Type type = field.getGenericType();
if (type instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) type;
return (Class) parameterizedType.getActualTypeArguments()【0】;
}
return null;
}
}
来自为知笔记(Wiz)
附件列表