Java架构学习之jason、fastjson解析、xml使用、dom4j解析、java反射机制及手写SpringIOC框架实例讲解,fastjsonspringioc
分享于 点击 5140 次 点评:41
Java架构学习之jason、fastjson解析、xml使用、dom4j解析、java反射机制及手写SpringIOC框架实例讲解,fastjsonspringioc
数据交换格式&反射机制&SpringIOC原理分析
一、什么是数据交换格式
客户端常用的数据交换格式有xml、json、html
二、JSON数据交换格式
json:是一种轻量级数据交换格式 xml:是一种重量级的数据交换格式,标记语言 json与xml区别: 1、json占用宽带小、xml占用宽带大 2、微服务是http+json进行通讯。 3、json轻量级xml重量级 数据交换格式 == 报文 == 发送的一些参数 == 参数列表
三、什么是json
json:是一种轻量级数据交换格式
json里面有jsonObject ---json对象 jsonArray---json数组 建maven项目使用的jsoncom.alibaba fastjson1.2.7
四、怎么去解析json,使用fastjson来解析案例
代码1 使用fastjson
package com.leeue.json; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; /** * * @classDesc: 功能描述:(使用fastjson 解析) * @author: * @Version:v1.0 * @createTime:2018年7月25日 下午1:46:10 */ public class JSONDemo01 { // 转义 把" 变成 \" public static String jsonStr = "{\"id\": \"001\",\"name\": \"里约\",\"items\": [{\"itemId\": \"002\",\"itemName\": \"嘻嘻\"}, {\"itemId\": \"002\",\"itemName\": \"嘻嘻\"}]}"; public static void main(String[] args) { // new JSONObject(); // 1、先将json字符串转换成jsonObject对象来操作。 JSONObject jsonObject = JSONObject.parseObject(jsonStr); String id = jsonObject.getString("id"); System.out.println("id:" + id); String name = jsonObject.getString("name"); System.out.println("name:" + name); // 取jsonArray类型 JSONArray jsonArray = jsonObject.getJSONArray("items"); for (int i = 0; i < jsonArray.size(); i++) { JSONObject object = jsonArray.getJSONObject(i); String itemId = object.getString("itemId"); System.out.println("itemId:" + itemId); String itemName = object.getString("itemName"); System.out.println("itemName:" + itemName); } } }
代码2:将json转换成对象再来解析
package com.leeue.json; import com.alibaba.fastjson.JSONObject; import com.leeue.entity.User; /** * * @classDesc: 功能描述:(将json数据文件 转换程对象) * @author: * @Version:v1.0 * @createTime:2018年7月25日 下午1:56:59 */ public class JSONDemo02 { public static String jsonStr = "{\"id\": \"001\",\"name\": \"里约\",\"items\": [{\"itemId\": \"002\",\"itemName\": \"嘻嘻\"}, {\"itemId\": \"002\",\"itemName\": \"嘻嘻\"}]}"; public static void main(String[] args) { User user = (User) new JSONObject().parseObject(jsonStr,User.class); System.out.println(user.toString()); } }
使用fastjson封装json字符串
package com.leeue.json; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; /** * * @classDesc: 功能描述:(自定义json字符串) * @author: * @Version:v1.0 * @createTime:2018年7月25日 下午2:08:10 */ public class JSONDemo03 { public static void main(String[] args) { JSONObject root = new JSONObject(); root.put("id", "23"); root.put("name", "leeue"); JSONArray jsonArray = new JSONArray(); JSONObject jsonObject = new JSONObject(); jsonObject.put("itemId", "001"); jsonObject.put("itemName", "打球"); JSONObject jsonObject2 = new JSONObject(); jsonObject2.put("itemId", "002"); jsonObject2.put("itemName", "嘻嘻"); jsonArray.add(jsonObject); jsonArray.add(jsonObject2); root.put("items", jsonArray); System.out.println(root.toJSONString()); } }
显示:
使用实体类封装json字符串
package com.leeue.json; /** * * @classDesc: 功能描述:(使用实体类封装成json字符串) * @author: * @Version:v1.0 * @createTime:2018年7月25日 下午2:15:31 */ import java.util.ArrayList; import java.util.List; import com.alibaba.fastjson.JSONObject; import com.leeue.entity.Item; import com.leeue.entity.User; public class JSONDemo04 { public static void main(String[] args) { User user = new User(); user.setId("23"); user.setName("嘻嘻"); List- items = new ArrayList
- (); Item item = new Item(); item.setItemId("11"); item.setItemName("哈哈"); items.add(item); Item item2 = new Item(); item2.setItemId("22"); item2.setItemName("敷敷"); items.add(item2); user.setItems(items); System.out.println(new JSONObject().toJSONString(user)); } }
显示结果:
五、xml使用
什么是xml? xml就是一个标记语言,一般做描述数据,配置文件等 DTD文件就是用来约束规则的。 解析xml方式有哪些? dom4j、sax、pull dom4j:不适合大文件解析 sax:适用大文件解析
dom4j解析xml案例
package com.leeue.xml; import java.util.Iterator; import java.util.List; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class XMLDemo01 { public static void main(String[] args) throws DocumentException { //1、获取到读取对象 SAXReader saxReader = new SAXReader(); Document document = saxReader.read("student.xml"); //获取根节点 获取到根节点就能获取到所有的节点了 Element rootElement = document.getRootElement(); getNodes(rootElement); } public static void getNodes(Element rootElement) { String name = rootElement.getName(); System.out.println("节点名称:"+name); //获取节点属性 List attributes = rootElement.attributes(); for (Attribute attribute:attributes) { System.out.println("属性名称"+attribute.getName()+"---"+attribute.getText()); } //获取值 String value = rootElement.getTextTrim(); if(!value.equals("")) { System.out.println("节点属性名称:"+value); } //判断是否还有下个节点 IteratorelementIterator = rootElement.elementIterator(); while (elementIterator.hasNext()) { Element next = elementIterator.next();//拿到下个节点 getNodes(next); } } }
六、Java反射机制(非常重要)
什么是Java反射? 反射机制就是正在运行动态获取当前类的所有信息。 类可以不用new 使用java反射机制帮你去初始化 类私有属性可以使用java的反射机制赋值。 核心》当前类的class机制 默认创建的时候调用的无参构造函数 应用:框架、Jdbc连接驱动、SpringIOC java反射机制作用? 提高程序的扩张性,封装一些工具类、写一些框架都会用上反射机制。 怎么禁止使用java反射机制? 将构造函数修饰符变成 private 私有的的。 将构造函数私有化。
案例:
package com.leeue.reflex; import java.lang.reflect.Constructor; import com.leeue.entity.User; /** * * @classDesc: 功能描述:(使用java反射机制来创建对象) * @author: * @Version:v1.0 * @createTime:2018年7月25日 下午3:02:04 */ public class ReflexDemo01 { public static void main(String[] args) throws Exception { // 1、new 方式创建对象 // User user = new User(); // 2、使用反射机制创建对象Class.forName("类的完整路径") Class forName = Class.forName("com.leeue.entity.User"); // 使用默认无参构造函数创建对象 User classUser = (User) forName.newInstance(); System.out.println(classUser); // 使用有参数的构造函数创建对象。 String.class.表示传入的构造函数参数是什么类型的 Constructor constructor = forName.getConstructor(String.class, String.class); User user = (User) constructor.newInstance("1", "xixi"); System.out.println("使用有参数构造函数创建User:" + user.toString()); } }
使用反射机制获取私有属性、方法和修改私有属性的值
案例:获取私有属性、方法
package com.leeue.reflex; import java.lang.reflect.Field; import java.lang.reflect.Method; import com.leeue.entity.User; /** * * @classDesc: 功能描述:(使用反射机制修改私有属性 ) * @author: * @Version:v1.0 * @createTime:2018年7月25日 下午3:38:14 */ public class ReflexDemo02 { public static void main(String[] args) throws Exception { //1.使用java的反射机制获取类的所有属性方法,并且唯私有属性赋值。 Class forName = Class.forName("com.leeue.entity.User"); //2.获取到当前类的所有属性 Field[] declaredFields = forName.getDeclaredFields(); for(Field fieled:declaredFields) { //打印出属性名称 System.out.println(fieled.getName()); } //3获取当前类的所有方法 Method[] declaredMethods = forName.getDeclaredMethods(); for(Method method:declaredMethods) { System.out.println(method.getName()); } //4、使用java的反射机制修改私有属性赋值 Object newInstance = forName.newInstance(); Field fileId = forName.getDeclaredField("id"); //要设置这个 允许反射操作私有属性,如果不加会报错 fileId.setAccessible(true); fileId.set(newInstance, "20"); Field fileName = forName.getDeclaredField("name"); fileName.setAccessible(true); fileName.set(newInstance, "哈哈哈"); //强转成user对象 User user = (User) newInstance; System.out.println(user.toString()); } }
七、使用反射机制+dom4j实现SpringIOC
什么是SpringIOC 控制反转,将每个bean与bean之间的关系交给第三方容器(spring)进行管理。 手写springIOC框架步骤: 第一步: 解析xml application.xml 第二步: 使用对应的beanId查找对应的xml节点,获取class属性。 第三步: 使用java的反射机制初始化类。 第四步: 使用java的反射机制给私有属性赋值。 这4步就是springIOC底层实现原理。dom4j+java反射机制 反射机制缺点:初始化对象效率低、扩展性高。
使用反射机制主要是初始化类: 第一种用法:调用无参构造函数创建对象 两行代码
// 2、使用反射机制创建对象Class.forName("类的完整路径") Class forName = Class.forName("com.leeue.entity.User"); // 使用默认无参构造函数创建对象 User classUser = (User) forName.newInstance();
第二种:使用有参构造函数创建对象
// 2、使用反射机制创建对象Class.forName("类的完整路径") Class forName = Class.forName("com.leeue.entity.User");
// 使用有参数的构造函数创建对象。 //String.class.表示传入的构造函数参数是什么类型的 Constructor constructor = forName.getConstructor(String.class, String.class);
如果直接操作私有属性需要加上权限:
//4、使用java的反射机制修改私有属性赋值 Object newInstance = forName.newInstance(); //获取id这个私有属性 Field fileId = forName.getDeclaredField("id"); //要设置这个 允许反射操作私有属性,如果不加会报错 fileId.setAccessible(true); //给id赋值 fileId.set(newInstance, "20");
八、手写SpringIOC框架
主要代码:
package com.leeue.xml; import java.util.Iterator; import java.util.List; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class XMLDemo01 { public static void main(String[] args) throws DocumentException { //1、获取到读取对象 SAXReader saxReader = new SAXReader(); Document document = saxReader.read("student.xml"); //获取根节点 获取到根节点就能获取到所有的节点了 Element rootElement = document.getRootElement(); getNodes(rootElement); } public static void getNodes(Element rootElement) { String name = rootElement.getName(); System.out.println("节点名称:"+name); //获取节点属性 List attributes = rootElement.attributes(); for (Attribute attribute:attributes) { System.out.println("属性名称"+attribute.getName()+"---"+attribute.getText()); } //获取值 String value = rootElement.getTextTrim(); if(!value.equals("")) { System.out.println("节点属性名称:"+value); } //判断是否还有下个节点 IteratorelementIterator = rootElement.elementIterator(); while (elementIterator.hasNext()) { Element next = elementIterator.next();//拿到下个节点 getNodes(next); } } }
用户点评