JAVA语言之jason、fastjson解析、xml使用、dom4j解析、java反射机制及手写SpringIOC框架实例讲解
小标 2018-09-07 来源 : 阅读 1019 评论 0

摘要:本文主要向大家介绍了JAVA语言之jason、fastjson解析、xml使用、dom4j解析、java反射机制及手写SpringIOC框架实例讲解,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

本文主要向大家介绍了JAVA语言之jason、fastjson解析、xml使用、dom4j解析、java反射机制及手写SpringIOC框架实例讲解,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

数据交换格式&反射机制&SpringIOC原理分析

一、什么是数据交换格式

客户端常用的数据交换格式有xml、json、html12

二、JSON数据交换格式

json:是一种轻量级数据交换格式
xml:是一种重量级的数据交换格式,标记语言

json与xml区别:
1、json占用宽带小、xml占用宽带大
2、微服务是http+json进行通讯。
3、json轻量级xml重量级


数据交换格式 == 报文 == 发送的一些参数 == 参数列表1234567891011

三、什么是json

json:是一种轻量级数据交换格式12


json里面有jsonObject ---json对象  jsonArray---json数组


建maven项目使用的json


       com.alibaba
       fastjson
       1.2.7
1234567891011

四、怎么去解析json,使用fastjson来解析案例

代码1 使用fastjson12
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);
       }

   }
}12345678910111213141516171819202122232425262728293031323334353637
代码2:将json转换成对象再来解析12
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());
   }
}123456789101112131415161718192021

使用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());
   }
}12345678910111213141516171819202122232425262728293031
显示:12


使用实体类封装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("嘻嘻");
       Listitems = 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));
   }
}1234567891011121314151617181920212223242526272829303132333435363738
显示结果:12


五、xml使用

什么是xml?
   xml就是一个标记语言,一般做描述数据,配置文件等


DTD文件就是用来约束规则的。

解析xml方式有哪些?
   dom4j、sax、pull

dom4j:不适合大文件解析
sax:适用大文件解析123456789101112

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);
       //获取节点属性
       Listattributes = 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);
       }

   }
}12345678910111213141516171819202122232425262728293031323334353637383940414243444546

六、Java反射机制(非常重要)

什么是Java反射?
   反射机制就是正在运行动态获取当前类的所有信息。

   类可以不用new 使用java反射机制帮你去初始化
   类私有属性可以使用java的反射机制赋值。
   核心》当前类的class机制
   默认创建的时候调用的无参构造函数

应用:框架、Jdbc连接驱动、SpringIOC


java反射机制作用?
   提高程序的扩张性,封装一些工具类、写一些框架都会用上反射机制。


怎么禁止使用java反射机制?
   将构造函数修饰符变成 private 私有的的。
   将构造函数私有化。12345678910111213141516171819

案例:

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());

   }
}123456789101112131415161718192021222324252627282930313233

使用反射机制获取私有属性、方法和修改私有属性的值

案例:获取私有属性、方法

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());


   }
}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152

七、使用反射机制+dom4j实现SpringIOC

什么是SpringIOC
   控制反转,将每个bean与bean之间的关系交给第三方容器(spring)进行管理。

手写springIOC框架步骤:

第一步:
   解析xml  application.xml
第二步:
   使用对应的beanId查找对应的xml节点,获取class属性。
第三步:
   使用java的反射机制初始化类。
第四步:
   使用java的反射机制给私有属性赋值。

这4步就是springIOC底层实现原理。dom4j+java反射机制

反射机制缺点:初始化对象效率低、扩展性高。123456789101112131415161718
使用反射机制主要是初始化类:
   第一种用法:调用无参构造函数创建对象  两行代码123
   // 2、使用反射机制创建对象Class.forName("类的完整路径")
       Class forName = Class.forName("com.leeue.entity.User");
       // 使用默认无参构造函数创建对象
       User classUser = (User) forName.newInstance();1234
   第二种:使用有参构造函数创建对象  
12
// 2、使用反射机制创建对象Class.forName("类的完整路径")
       Class forName = Class.forName("com.leeue.entity.User");12
// 使用有参数的构造函数创建对象。  
       //String.class.表示传入的构造函数参数是什么类型的
       Constructor constructor =
       forName.getConstructor(String.class, String.class);1234
如果直接操作私有属性需要加上权限:12
//4、使用java的反射机制修改私有属性赋值
       Object newInstance = forName.newInstance();        //获取id这个私有属性
       Field fileId = forName.getDeclaredField("id");        //要设置这个 允许反射操作私有属性,如果不加会报错
       fileId.setAccessible(true);        //给id赋值
       fileId.set(newInstance, "20");12345678

八、手写SpringIOC框架

主要代码:12
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);
       //获取节点属性
       Listattributes = 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频道!


本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程