项目分析_xxoo-master
项目介绍:使用java1.5的原生xml操作类实现 对象<-->xml字符串的相互转化
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的更多相关文章
- iOS项目分析及优化
iOS项目分析及优化 来源:吴白的简书 从代码看一个程序员的笔力 从代码的整洁度上就可以看出一个程序员的实力,规范其实就是让你养成一种良好习惯的标杆,在此面前我们应该顺从.本篇我们以OC为例,统 ...
- xamarin MasterDetailPage点击Master时卡顿现象
在很多项目中经常会使用到MasterDetailPage的布局方式,而且一般做为主页面来开发,在开发中,发现一个并不算Bug的问题,但是却发生了,以此记录下来,方便大家探讨. 现象是这样的,我开发了一 ...
- backup3:master 数据库的备份和还原
在SQL Server 中,master 数据库记录系统级别的元数据,例如,logon accounts, endpoints, linked servers, and system configur ...
- 当master down掉后,pt-heartbeat不断重试会导致内存缓慢增长
最近同事反映,在使用pt-heartbeat监控主从复制延迟的过程中,如果master down掉了,则pt-heartbeat则会连接失败,但会不断重试. 重试本无可厚非,毕竟从使用者的角度来说,希 ...
- Win10 UWP开发系列:实现Master/Detail布局
在开发XX新闻的过程中,UI部分使用了Master/Detail(大纲/细节)布局样式.Win10系统中的邮件App就是这种样式,左侧一个列表,右侧是详情页面.关于这种 样式的说明可参看MSDN文档: ...
- 记处理线上记录垃圾日志 The view 'Error' or its master was not found
最近监控线上日志,网站是ASP.NET MVC 开发的,发现不少错误日志都记录同样的内容: The view 'Error' or its master was not found or no vie ...
- SQL Server 中master..spt_values的应用
今天在做数据分析报表的时候遇到一个这样的问题. 表结构如下.部门编码.部门名称.部门人员ID(中间用逗号分割) 我想通过和人员表链接,查询出一个新的数据集,查询出的结果集格式如下:人员信息(ID或者姓 ...
- POJ 2251 Dungeon Master(3D迷宫 bfs)
传送门 Dungeon Master Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 28416 Accepted: 11 ...
- Greenplum记录(一):主体结构、master、segments节点、interconnect、performance monitor
结构:Client--master host--interconnect--segment host 每个节点都是单独的PG数据库,要获得最佳的性能需要对每个节点进行独立优化. master上不包含任 ...
- 对日期 ,和 master.dbo.spt_values 表操作
if object_id('tempdb..#xs') is not null drop table #xs; ), date datetime, sale float) insert into #x ...
随机推荐
- mac osx install mysql
(1) download mysql dmg (2) install (3) /usr/local/mysql/bin/mysql -u root -p change password
- 记录一次Quartz2D学习(一)
经常看点 drawRect的重写 但是不知道这究竟是神马 今天开始学习这一块的东西,更确切地说是深入 早在view的时候 就经常会调用layer的maskToBounds属性,其实 重写 drawR ...
- DBCC SHRINKDATABASE xxxx was skipped because the file does not have enough free
假设你创建一个数据库时,指定其初始化大小(SIZE )非常大.例如,如下测试案例所示 USE [master] GO CREATE DATABASE [TEST] ON PRIMARY ( N ...
- 【转】hive优化之--控制hive任务中的map数和reduce数
一. 控制hive任务中的map数: 1. 通常情况下,作业会通过input的目录产生一个或者多个map任务. 主要的决定因素有: input的文件总个数,input的文件大小,集群设置 ...
- 【hive】——Hive sql语法详解
Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构 化的数据文件映射为一张数据库表,并提供完整的SQL查 ...
- 解决MyEclipse中的js报错的小方法
今天,下了个模版,但是导进去的时候发现js会报错.看了下其他都没有错误.而有一个js报错误,请原谅我有点红色强迫症,不能留一点红色 . 错误如下:Syntax error on token " ...
- win10磁盘100%解决办法
控制面板-管理工具-服务 找到“HomeGroupListener”服务,双击打开或右键单击“属性”命令. 在弹出属性界面窗口,在常规选项卡单击启动类型的下拉框,出来的列表选择“禁用”.然后在服务状态 ...
- 【C++】输入多行数字到数组
前天做某公司笔试题的时候,其输入格式是多行数字,每行以空格为分隔符,以换行符号为结束输入到多个数组.在JAVA中有相应的函数直接将一行拆成数组,感觉在C++中这中输入方式还是挺奇怪的,今天想出一种解决 ...
- ajax缓存问题
默认情况下,请求总会被发出去,但浏览器有可能从它的缓存中调取数据.换句话说,在缓存过期之前,针对相同地址发起的多个Ajax请求,只有第一次会真正发送到服务端.要禁止使用缓存的结果,可以设置 cache ...
- Dan Zhang - Visual Studio ALM MVP
I am a Microsoft Certified Partner specialising in .NET solutions, also worked as an ALM consultant. ...