详尽分享项目分析_xxoo

简介: 详尽分享项目分析_xxoo

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

}//代码效果参考:http://www.ezhiqi.com/zx/art_5312.html

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 getInstance(Class clazz) throws InstantiationException, IllegalAccessException{

return clazz.newInstance();

}

/

获取数组属性中所持有的类型

@param field

@return class

/

public static Class getArrayGenericType(Field field){

Type type = field.getGenericType();

if (type instanceof ParameterizedType) {

ParameterizedType parameterizedType = (ParameterizedType) type;

return (Class) parameterizedType.getActualTypeArguments()【0】;

}

return null;

}

}

来自为知笔记(Wiz)

附件列表

相关文章
|
敏捷开发 监控 容灾
阿里巴巴DevOps实践指南(二十二)| 发布策略
DevOps 追求更短的迭代周期、更高频的发布。但发布的次数越多,引入故障的可能性就越大。更多的故障将会降低服务的可用性,进而影响到客户体验。所以,为了保证服务质量,守好发布这个最后一道关,阿里逐步发展出了适应 DevOps 要求的发布策略。
阿里巴巴DevOps实践指南(二十二)| 发布策略
|
编译器 Linux API
Qt之Q_OBJECT 宏的神奇之旅(二)
Qt之Q_OBJECT 宏的神奇之旅
522 0
|
人工智能 JSON 自然语言处理
你的Agent稳定吗?——基于大模型的AI工程实践思考
本文总结了作者在盒马智能客服的落地场景下的一些思考,从工程的角度阐述对Agent应用重要的稳定性因素和一些解法。
1209 12
|
网络协议 开发者
TCP连接的四次挥手过程及其必要性
在网络通信中,TCP(传输控制协议)以其可靠性和有序性著称。TCP连接的建立和终止都需要特定的握手过程。本文将详细描述TCP连接的四次挥手(四次挥手)过程,并探讨为什么需要四次挥手来终止一个TCP连接。
575 8
|
数据采集 机器学习/深度学习 数据可视化
R实战| PCA、tSNE、UMAP三种降维方法在R中的实现
R实战| PCA、tSNE、UMAP三种降维方法在R中的实现
855 0
keep-alive 组件有哪些常用的属性和配置选项
keep-alive 组件有哪些常用的属性和配置选项
|
JSON API 数据库
Django的web框架Django Rest_Framework精讲(一)
Django的web框架Django Rest_Framework精讲(一)
717 1
|
前端开发 JavaScript Java
解决springboot+vue+mybatis中,将后台数据分页显示在前台,并且根据页码自动跳转对应页码信息
该博客文章讲述了如何在Spring Boot + Vue + MyBatis的项目中实现后台数据的分页查询,并在前端进行显示和页码跳转,包括后端的分页查询实现、前端与后端的交互以及使用Element UI进行分页展示的方法。
|
存储 安全 Java
CopyOnWriteArrayList底层原理全面解析【建议收藏】
CopyOnWriteArrayList是Java中的一个线程安全的集合类,是ArrayList线程安全版本,主要通过Copy-On-Write(写时复制,简称COW)机制来保证线程安全。 Copy-On-Write机制核心思想:向一个数组中添加数据时,不直接操作原始数组,而是拷贝原始数组生成一份原始数组副本,将需要添加的数据添加到原始数组副本中,操作完成后再用原始数组副本直接替换原始数组,从而保证多个线程同时操作原始数组时的线程安全。
|
移动开发 JavaScript 前端开发
HTML5作业(二)-----扑克牌拖放小游戏
该实验旨在理解元素拖放、CSS定位和DOM操作,任务是创建一个扑克牌拖放游戏。用户需将A框内13张随机扑克牌(背面朝上)按顺序拖至B框,最多存5张。当B框内形成顺子时游戏结束,显示拖动次数。实验提供HTML结构及部分JavaScript代码,包括创建和乱序扑克牌、处理拖放事件等。
438 0