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

     





    附件列表

  • 相关阅读:
    ToolbarLayout的使用
    设置NavigationView子布局Menu图片的颜色
    设置RecyclerView显示滚动条(这里演示垂直的滚动条,水平的道理一样)
    在使用ToolBar + AppBarLayout,实现上划隐藏Toolbar功能,遇到了一个坑。
    Android中设置Imageview的图片充满整个布局
    Android透明状态栏设置
    关于NavigationView中item的字体颜色和icon选中状态颜色
    dp、sp 、 px之间的相互转化的工具类
    今天使用JNI时,出现了一个错误:java.lang.UnsatisfiedLinkError : dlopen failed: library //dlopen打开失败
    kubernetes的几个概念
  • 原文地址:https://www.cnblogs.com/gossip/p/6076462.html
Copyright © 2020-2023  润新知