• 项目分析_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;
        }
         
    }

     





    附件列表

  • 相关阅读:
    DB2 for Z/os Statement prepare
    Foreign key (referential) constraints on DB2 LUW v105
    复制Informational constraints on LUW DB2 v105
    DB2 SQL Mixed data in character strings
    DB2 create partitioned table
    MVC中使用EF的技巧集(一)
    Asp.Net MVC 开发技巧(二)
    Linq使用技巧及查询示例(一)
    Asp.Net MVC 开发技巧(一)
    Asp.Net MVC Identity 2.2.1 使用技巧(八)
  • 原文地址:https://www.cnblogs.com/gossip/p/6076462.html
Copyright © 2020-2023  润新知