项目介绍:使用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();
}
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> T getInstance(Class<T> clazz)
throws
InstantiationException, IllegalAccessException{
return
clazz.newInstance();
}
/**
* 获取数组属性中所持有的类型
* @param field
* @return class
*/
public
static
<T> Class<T> getArrayGenericType(Field field){
Type type = field.getGenericType();
if
(type
instanceof
ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) type;
return
(Class<T>) parameterizedType.getActualTypeArguments()[
0
];
}
return
null
;
}
}
|
附件列表