Java 数据交换格式反射机制SpringIOC原理分析
数据交换格式&反射机制&SpringIOC原理分析
- 什么是数据交换格式?
- 数据交换格式使用场景
- JSON简单使用
- 什么是JSON?
- JSON格式的分类
- 常用JSON解析框架
- 使用fastjson解析json
- XML简单使用
- 什么是XML?
- XML样例
- XML与JSON区别?
- Java反射机制
- 什么是Java反射?
- 反射机制的作用
- 反射机制的应用场景
- 反射机制获取类的三种方法
- 反射创建对象的方式
- 反射创建api
- 使用反射为类私有属性赋值
- JDBC反射加载驱动
- 手写SpringIOC框架
- 什么是SpringIOC
- 什么是SpringIOC底层实现原理
什么是数据交换格式?
客户端与服务器常用数据交换格式xml、json、html等
数据交换格式使用场景
移动端(安卓、IOS)通讯方式采用http协议+JSON格式 走restful风格。
很多互联网项目都采用Http协议+JSON
因为xml比较重WebService服务采用http+xml格式 银行项目使用比较多
JSON简单使用
什么是JSON?
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,相比于xml这种数据交换格式来说,因为解析xml比较的复杂,而且需要编写大段的代码,所以客户端和服务器的数据交换格式往往通过JSON来进行交换。
{"id": "10","name": "user","items": [{"itemId": "20","itemName": "张三"},{"itemId": "21","itemName": "李四"}]
}
JSON:JavaScript 对象表示法(JavaScript Object Notation)。
JSON的形式是用大括号“{}”包围起来的项目列表,每一个项目间用逗号(,)分隔,而项目就是用冒号(:)分隔的属性名和属性值。这是典型的字典表示形式,也再次表明javascript里的对象就是字典结构。不管多么复杂的对象,都可以用一句JSON代码来创建并赋值。在JSON中,名称 / 值对包括字段名称(在双引号中),后面写一个冒号,然后是值
JSON格式的分类
JSON有两种结构
json简单说就是javascript中的对象和数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构
1、对象:对象在js中表示为“{}”括起来的内容,数据结构为 {key:value,key:value,…}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为 对象.key 获取属性值,这个属性值的类型可以是 数字、字符串、数组、对象几种。
2、数组:数组在js中是中括号“[]”括起来的内容,数据结构为 [“java”,“javascript”,“vb”,…],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。
经过对象、数组2种结构就可以组合成复杂的数据结构了。
常用JSON解析框架
fastjson(阿里)、gson(谷歌)、jackson(SpringMVC自带)
使用fastjson解析json
添加jar fastjson-1.1.43 或引入maven依赖
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.1.43</version>
</dependency>
使用fastjson api
public static final Object parse(String text); // 把JSON文本parse为JSONObject或者JSONArray
public static final JSONObject parseObject(String text); // 把JSON文本parse成JSONObject
public static final <T> T parseObject(String text, Class<T> clazz); // 把JSON文本parse为JavaBean
public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray
public static final <T> List<T> parseArray(String text, Class<T> clazz); //把JSON文本parse成JavaBean集合
public static final String toJSONString(Object object); // 将JavaBean序列化为JSON文本
public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化为带格式的JSON文本
public static final Object toJSON(Object javaObject); // 将JavaBean转换为JSONObject或者JSONArray。
解析json
static String jsonStr = "{\"sites\":[{\"name\":\"user\",\"url\":\"www.icloudit.com\"},{\"name\":\"李小贱\",\"url\":\"https://blog.csdn.net/LiCJ1113538586/\"}]}";public static void main(String[] args) {JSONObject jsonObject = new JSONObject();// 将json字符串转为jsonbjectJSONObject jsonStrObject = jsonObject.parseObject(jsonStr);JSONArray jsonArray = jsonStrObject.getJSONArray("sites");for (Object object : jsonArray) {JSONObject stObject = (JSONObject) object;String name = stObject.getString("name");String url = stObject.getString("url");System.out.println(name + "---" + url);}}
Json转对象
定义类
class Item {private String itemId;private String itemName;public String getItemId() {return itemId;}public void setItemId(String itemId) {this.itemId = itemId;}public String getItemName() {return itemName;}public void setItemName(String itemName) {this.itemName = itemName;}@Overridepublic String toString() {return "Item [itemId=" + itemId + ", itemName=" + itemName + "]";}}public class User {private String id;private String name;private List<Item> items;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public List<Item> getItems() {return items;}public void setItems(List<Item> items) {this.items = items;}@Overridepublic String toString() {return "User [id=" + id + ", name=" + name + ", items=" + items + "]";}}
Json转换对象api
// 2.使用java反射机制 对应生成对象User user = new JSONObject().parseObject(json, User.class);System.out.println("user:" + user.toString());
组装json
Json api封装json
// 1.json api 封装jsonJSONObject root = new JSONObject();root.put("id", "01");root.put("name", "张三");JSONArray arrayList = new JSONArray();JSONObject object1 = new JSONObject();object1.put("itemId", "20");object1.put("itemName", "李四");JSONObject object2 = new JSONObject();object2.put("itemId", "30");object2.put("itemName", "王五");arrayList.add(object1); arrayList.add(object2);root.put("items", arrayList);System.out.println(root.toJSONString());
将对象转换成json字符串
User user = new User();user.setId("01");user.setName("张三");List<Item> items =new ArrayList<Item>();Item item1 = new Item();item1.setItemId("20");item1.setItemName("李四");Item item2 = new Item();item2.setItemId("30");item2.setItemName("王五");items.add(item1);items.add(item2);user.setItems(items);System.out.println(new JSONObject().toJSONString(user));
XML简单使用
什么是XML?
它是可扩展标记语言(Extensible Markup Language,简称XML),是一种标记语言。
XML 全称为可扩展的标记语言。主要用于描述数据和用作配置文件。
XML 文档在逻辑上主要由一下 5 个部分组成:
1,XML 声明:指明所用 XML 的版本、文档的编码、文档的独立性信息,
2,文档类型声明:指出 XML 文档所用的 DTD
3,元素:由开始标签、元素内容和结束标签构成
4,注释:以结束,用于对文档中的内容起一个说明作用
5,处理指令:通过处理指令来通知其他应用程序来处理非 XML 格式的数据,格式为XML 文档的根元素被称为文档元素,它和在其外部出现的处理指令、注释等作为文档实体的子节点,根元素本身和其内部的子元素也是一棵树。
XML样例
<?xml version="1.0" encoding="UTF-8"?>
<students> <student1 id="001"> <name>张三</name> <age>18</age></student1> <student2 id="002"> <name>李四</name> <age>20</age></student2>
</students>
<?xml version="1.0" encoding="UTF-8"?>作用?
xml文件头部要写的话,说明了xml的版本和编码,utf-8一般是网络传输用的编码
XML与JSON区别?
Xml是重量级数据交换格式,占宽带比较大。
JSON是轻量级交换格式,xml占宽带小。
所有很多互联网公司都会使用json作为数据交换格式
很多银行项目,大多数还是在使用xml。
Java反射机制
什么是Java反射?
就是正在运行,动态获取这个类的所有信息。
反射机制的作用
- 反编译:.class–>.java
- 通过反射机制访问java对象的属性,方法,构造方法等
反射机制的应用场景
- Jdbc 加载驱动
- Spring ioc
- 框架
反射机制获取类的三种方法
//第一种方式: Classc1 = Class.forName("Employee"); //第二种方式: //java中每个类型都有class 属性. Classc2 = Employee.class; //第三种方式: //java语言中任何一个java对象都有getClass 方法 Employeee = new Employee(); Classc3 = e.getClass(); //c3是运行时类 (e的运行时类是Employee)
反射创建对象的方式
Class<?> forName = Class.forName("com.icloudit.entity.User");// 创建此Class 对象所表示的类的一个新实例 调用了User的无参数构造方法.Object newInstance = forName.newInstance();
实例化有参构造函数
Class<?> forName = Class.forName("com.icloudit.entity.User");Constructor<?> constructor = forName.getConstructor(String.class, String.class);User newInstance = (User) constructor.newInstance("123", "123");
反射创建api
方法名称 | 作用 |
---|---|
getDeclaredMethods] | 获取该类的所有方法 |
getReturnType | 获取该类的返回值 |
getParameterTypes | 获取传入参数 |
getDeclaredFields | 获取该类的所有字段 |
setAccessible | 允许访问私有成员 |
使用反射为类私有属性赋值
// 为user对象私有属性赋值Class<?> classUser = Class.forName("com.icloudit.entity.User");// 获取到当前的所有属性Field[] fields = classUser.getDeclaredFields();for (Field field : fields) {System.out.println(field.getName());}// 获取当前所有的方法Method[] declaredMethods = classUser.getDeclaredMethods();for (Method method : declaredMethods) {System.out.println(method.getName());}// 初始化对象User user = (User) classUser.newInstance();Field declaredField = classUser.getDeclaredField("id");// 标记为true 允许反射赋值declaredField.setAccessible(true);declaredField.set(user, "20");System.out.println("使用反射机制给id赋值为:"+user.getId());
JDBC反射加载驱动
public class DemoJDBC {public static void main(String[] args) throws Exception {// 加载驱动类Class.forName("com.mysql.jdbc.Driver");// 通过DriverManager获取数据库连接String url = "jdbc:mysql://192.168.1.150/test";String user = "root";String password = "123456";Connection connection = (Connection) DriverManager.getConnection(url, user, password);PreparedStatement statement = (PreparedStatement) connection.prepareStatement("insert persion (name, age) value (?, ?)");statement.setString(1, "hdu");statement.setInt(2, 21);statement.executeUpdate();ResultSet resultSet = statement.executeQuery("select * from persion");// 操作ResultSet结果集while (resultSet.next()) {// 第一种获取字段方式System.out.println(resultSet.getString(1) + " " + resultSet.getString(2) + " " + resultSet.getString(3));}// 关闭数据库连接resultSet.close();statement.close();connection.close();}
}
禁止使用反射机制初始化
将构造函数为私有化
手写SpringIOC框架
什么是SpringIOC
SpringIOC,就是把每一个bean(实体类)与bean(实体了)之间的关系交给第三方容器进行管理。
什么是SpringIOC底层实现原理
- 读取bean的XML配置文件
- 使用beanId查找bean配置,并获取配置文件中class地址。
- 使用Java反射技术实例化对象
- 获取属性配置,使用反射技术进行赋值。
详细步骤
- 利用传入的参数获取xml文件的流,并且利用dom4j解析成Document对象
- 对于Document对象获取根元素对象后对下面的标签进行遍历,判断是否有符合的id.
- 如果找到对应的id,相当于找到了一个Element元素,开始创建对象,先获取class属性,根据属性值利用反射建立对象.
- 遍历标签下的property标签,并对属性赋值.注意,需要单独处理int,float类型的属性.因为在xml配置中这些属性都是以字符串的形式来配置的,因此需要额外处理.
- 如果属性property标签有ref属性,说明某个属性的值是一个对象,那么根据id(ref属性的值)去获取ref对应的对象,再给属性赋值.
- 返回建立的对象,如果没有对应的id,或者下没有子标签都会返回null
Java 数据交换格式反射机制SpringIOC原理分析相关推荐
- 数据交换格式与SpringIOC底层实现
课程目标 XML和JSON Java反射机制 手写SpringIOC 什么是数据交换格式 客户端与服务器常用数据交换格式xml.json.html 数据交换格式用场景 移动端(安卓.IOS)通讯方式采 ...
- 【Java】JSON数据交换格式及其使用案例(聊天工具)
数据交换格式主要分为纯文本格式,XML格式和JSON格式.其中纯文本格式是一种简单的,无格式的数据交换方式:而XML格式和JSON格式可以带有描述信息,它们叫做"自描述的"结构化文 ...
- Java反射机制的原理及作用
反射机制是Java特性之一,反射机制是构建框架技术的基础所在.灵活掌握Java反射机制,对大家以后学习框架技术有很大的帮助. 那么什么是Java的反射呢? 大家都知道,要让Java程序能够运行,那么就 ...
- XML和JSON 数据交换格式
为什么80%的码农都做不了架构师?>>> 一.什么是数据交换格式? 客户端与服务器常用数据交换格式xml.json.html 二.数据交换格式应用场景 移动端(安卓.IOS)通 ...
- XML和JSON两种数据交换格式的比较
目前,在web开发领域,主要的数据交换格式有XML和JSON,对于XML相信每一个web developer都不会感到陌生: 相比之下,JSON可能对于一些新步入开发领域的新手会感到有些陌生,也可能你 ...
- 于数据交换格式XML和JSON的比较
目前,在web开发领域,主要的数据传输格式有XML和JSON,对于XML相信每一个web developer都不会感到陌生:相比之下,JSON可能对于一些新步入开发领域的新手会感到有些陌生,也可能你之 ...
- Ajax--概述、xhr对象的常用属性和方法、xhr的常用事件、xhr对象发送POST请求、xhr对象发送GET请求、xhr对象的兼容性问题、数据交换格式(XML、JSON)
一.概述 1.1 发展历程 在开始之前先来看一下Ajax的工作原理吧,如下图所示: Ajax全称Asynchronous javascript and xml(异步 JavaScript 和 XML) ...
- 常用的数据交换格式有哪些_Linux后台开发6大常用的开源库,让你在同行中脱颖而出...
后台开发,语言主要是 c 和 c++ , 这里简单罗列一下工作中用的很频繁的那些开源软件 1. OpenSSL openssl OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法.常用的密钥 ...
- Redis数据持久化机制AOF原理分析一---转
http://blog.csdn.net/acceptedxukai/article/details/18136903 http://blog.csdn.net/acceptedxukai/artic ...
最新文章
- android查询竞价处理,公平可靠的竞价方式,应对越来越高的流量获取成本,如何解决推广费用过高的问题可能是...
- 通过什么来衡量C# Socket服务的效能
- LeetCode--055--跳跃游戏(java)
- win10中的ubuntu子系统忘记root密码如何修改
- TeamCity和GitLab整合
- unsigned a:1;
- docker-compose观察实时日志_大数据项目实战之在线教育(03实时需求) - 十一vs十一...
- 前端学习(2963):element-ui介绍
- android分享数据到不同平台组件化
- WaitForSingleObject的使用
- ubuntuv20启动界面美化_小米任务栏美化软件下载-小米任务栏美化官方版软件下载v1.0...
- 计算机二级vb大题,全国计算机等级考试二级vb操作题最后一道大题题库
- c#获取电脑硬件信息参数说明(声卡篇 Win32_SoundDevice )
- 私有化单机题库管理软件“题库管家”1.3版本正式发布,windows版与mac版下载地址
- Specification动态查询
- 数据流图(DFD)概念及画法
- tahoma字体对中文字的影响
- JAVA音视频解决方案----音频处理方案
- 熬夜爆肝整理!史上最硬核的Mysql函数大全,还不收藏?
- Sqlmap 22.05.23.05
热门文章
- pf与ckf_CKF启用VR直播,暴风魔镜呈现格斗赛事“拳拳到肉”
- kafka中leader和follower、AR、ISR、OSR、Controller的选举、为什么不能通过ZK的方式来选举partition的leader?
- 线性表的练习--学生成绩统计
- python爬虫之壁纸的下载
- Python之险种缴费记录管理-保存文件版本
- LeetCode #378 JavaScript
- Redis 知识点和面试题(持续更新ing)
- android 音效处理(1)
- npm run serve起项目报错node-sass not find
- 07.nodejs文件操作