项目介绍:使用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 ;
}
} |