<dl id="opymh"></dl>

<div id="opymh"></div>
      <div id="opymh"><tr id="opymh"></tr></div>

        <em id="opymh"><ins id="opymh"><mark id="opymh"></mark></ins></em><sup id="opymh"><menu id="opymh"></menu></sup>

        <em id="opymh"></em>

        <em id="opymh"><ol id="opymh"></ol></em>

              频道栏目
              首页 > 程序开发 > 软件开发 > Java > 正文
              Java架构学习之jason、fastjson解析、xml使用、dom4j解析、java反射机制及手写SpringIOC框架实例讲解
              2018-07-27 13:52:10         来源Leeue李月  
              收藏   我要投稿

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

              一、什么是数据交换格式

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

              二、JSON数据交换格式

              json:是一种轻?#32771;?#25968;据交换格式
              xml:是一种重?#32771;?#30340;数据交换格式标记语言
              
              json与xml区别
              1、json占用宽带小、xml占用宽带大
              2、微服务是http+json进行通讯。
              3、json轻?#32771;xml重?#32771;?
              
              
              数据交换格式 == 报文 == 发送的一些参数 == 参数列表
              

              三、什么是json

              json:是一种轻?#32771;?#25968;据交换格式
              

              这里写图片描述

              json里面有jsonObject ---json对象  jsonArray---json数组
              
              
              建maven项目使用的json 
              
              
                      com.alibaba
                      fastjson
                      1.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);
                      }
              
                      //判断是否还有下个节点
                      Iterator elementIterator = 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反射机制
              
              反射机制缺点初始化对象效?#23454;諭?#25193;展性高。
              

              使用反射机制主要是初始化类
                  第一种用法调用无参构造函数创建对象  两?#20889;?#30721;
              
                  // 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);

              如果直接操作私有属性需要加?#20808;?#38480;
              
              //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);
                      }
              
                      //判断是否还有下个节点
                      Iterator elementIterator = rootElement.elementIterator();
                      while (elementIterator.hasNext()) {
                          Element next = elementIterator.next();//拿到下个节点
                          getNodes(next);
                      }
              
                  }
              }
              
              点击复制链接 与好友分享!回本站首页
              上一篇Java架构学习之线程池使用讲解
              下一篇Java环境变量配置方法(Windows
              相关文章
              图文推荐
              点击排行

              关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报?#34892;?/a>

              版权所有: 红黑联盟--致力于做实用的IT技术学习网站

              自堀敬友挫邪
              <dl id="opymh"></dl>

              <div id="opymh"></div>
                  <div id="opymh"><tr id="opymh"></tr></div>

                    <em id="opymh"><ins id="opymh"><mark id="opymh"></mark></ins></em><sup id="opymh"><menu id="opymh"></menu></sup>

                    <em id="opymh"></em>

                    <em id="opymh"><ol id="opymh"></ol></em>

                          <dl id="opymh"></dl>

                          <div id="opymh"></div>
                              <div id="opymh"><tr id="opymh"></tr></div>

                                <em id="opymh"><ins id="opymh"><mark id="opymh"></mark></ins></em><sup id="opymh"><menu id="opymh"></menu></sup>

                                <em id="opymh"></em>

                                <em id="opymh"><ol id="opymh"></ol></em>

                                      12僉5号夸傍苧 逓歪噴匯僉励窮徨恠米夕書爺 酔赤褒科書絡蝕襲潤惚芝村 怏鎗豚豚駅嶄噴怏怏鎗 藍嶄藍胎務禪杪躬 采臼電双7恠米夕 酷巒11僉励蝕襲潤惚匯協釘 寄赤邑除800豚恠米夕 楳今酔3恍爺蝕襲潤惚臥儂 悶科鈍佛科蝕襲岷殴篇撞岷殴 寃臭噴匯僉励販僉鷹恠米夕 病廉酔赤噴蛍販励嶄襲 牽科嶄襲科同 竺竺司司廨匍匯硫嶄蒙 臼奨噴匯僉励販励蝕襲潤惚