项目分析_xxoo-master

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

 

 

 

 

 

 

 

 

 

 

 





附件列表

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值