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

附件列表

项目分析_xxoo-master的更多相关文章

  1. iOS项目分析及优化

    iOS项目分析及优化  来源:吴白的简书   从代码看一个程序员的笔力 从代码的整洁度上就可以看出一个程序员的实力,规范其实就是让你养成一种良好习惯的标杆,在此面前我们应该顺从.本篇我们以OC为例,统 ...

  2. xamarin MasterDetailPage点击Master时卡顿现象

    在很多项目中经常会使用到MasterDetailPage的布局方式,而且一般做为主页面来开发,在开发中,发现一个并不算Bug的问题,但是却发生了,以此记录下来,方便大家探讨. 现象是这样的,我开发了一 ...

  3. backup3:master 数据库的备份和还原

    在SQL Server 中,master 数据库记录系统级别的元数据,例如,logon accounts, endpoints, linked servers, and system configur ...

  4. 当master down掉后,pt-heartbeat不断重试会导致内存缓慢增长

    最近同事反映,在使用pt-heartbeat监控主从复制延迟的过程中,如果master down掉了,则pt-heartbeat则会连接失败,但会不断重试. 重试本无可厚非,毕竟从使用者的角度来说,希 ...

  5. Win10 UWP开发系列:实现Master/Detail布局

    在开发XX新闻的过程中,UI部分使用了Master/Detail(大纲/细节)布局样式.Win10系统中的邮件App就是这种样式,左侧一个列表,右侧是详情页面.关于这种 样式的说明可参看MSDN文档: ...

  6. 记处理线上记录垃圾日志 The view 'Error' or its master was not found

    最近监控线上日志,网站是ASP.NET MVC 开发的,发现不少错误日志都记录同样的内容: The view 'Error' or its master was not found or no vie ...

  7. SQL Server 中master..spt_values的应用

    今天在做数据分析报表的时候遇到一个这样的问题. 表结构如下.部门编码.部门名称.部门人员ID(中间用逗号分割) 我想通过和人员表链接,查询出一个新的数据集,查询出的结果集格式如下:人员信息(ID或者姓 ...

  8. POJ 2251 Dungeon Master(3D迷宫 bfs)

    传送门 Dungeon Master Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 28416   Accepted: 11 ...

  9. Greenplum记录(一):主体结构、master、segments节点、interconnect、performance monitor

    结构:Client--master host--interconnect--segment host 每个节点都是单独的PG数据库,要获得最佳的性能需要对每个节点进行独立优化. master上不包含任 ...

  10. 对日期 ,和 master.dbo.spt_values 表操作

    if object_id('tempdb..#xs') is not null drop table #xs; ), date datetime, sale float) insert into #x ...

随机推荐

  1. Windows TCP连接数限制解决

    reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" /v "M ...

  2. 敏捷遇上UML—软创基地马年大会(广州站 2014-4-19)

        我们将在广州为您奉献高端知识大餐,当敏捷遇上UML,会发生怎样的化学作用呢?首席专家张老师将会为您分享需求分析及软件设计方面的最佳实践,帮助您掌握敏捷.UML及两者相结合的实战技巧. 时间:2 ...

  3. TCP三次握手建立连接

    基本过程:       ISN(初始序号)随时间变化,每一个连接具有不同的ISN,防止在网络延迟中分组被重新发送.   请求端发送SYN(同步序号 )=1,seq=ISN(32bits序号,每4ms+ ...

  4. .NET应用架构设计—适当使用活动记录模式代替领域模型模式

    阅读目录: 1.背景介绍 2.简单介绍领域模型模式.活动记录模式 3.活动记录模式的简单示例及要点 4.总结 1.背景介绍 对软件开发方法论有兴趣的博友应该发现最近“领域驱动设计”慢慢的被人发现被人实 ...

  5. Linux简介及常用命令使用3--vi编辑器

    1.进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 [新建文件]vi +n filename :打开文件,并将光标置于第n行首 [比如:某个shell报错的行数时使用] ...

  6. Java日志框架:SLF4J,Common-Logging,Log4J,Logback说明

    Log4j  Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件.甚至是套接口服务 器.NT的事件记录器.UNIX Syslog守护进程等 ...

  7. 深度理解Jquery 中 offset() 方法

    参考原文:深度理解Jquery 中 offset() 方法

  8. getSupportFragmentManager要用在FragmentActivity及其子类中

    getSupportFragmentManager要用在FragmentActivity及其子类中!! 关于安卓抽屉导航!! * 自定义侧边栏

  9. 小结-stm32 驱动LED灯

    使用位带操作,位带操作就是把每个比特膨胀成一个32位的字,当访问这些字的时候就访问这些比特位. http://www.cnblogs.com/xiaobo-Linux/ 然后,端口使能: //³õʼ ...

  10. Windows10的革命之路-全新UWP开发平台

    众所周知,最近几年,微软一直在操作系统上进行统一化的尝试.第一次尝试的产品——Windows 8/8.1操作系统完全谈不上成功.请看下图: 我个人认为,这并不意味着操作系统统一化的策略是错误的,只能算 ...