<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:是一種輕量級數據交換格式
              xml:是一種重量級的數據交換格式,標記語言
              
              json與xml區別:
              1、json占用寬帶小、xml占用寬帶大
              2、微服務是http+json進行通訊。
              3、json輕量級xml重量級
              
              
              數據交換格式 == 報文 == 發送的一些參數 == 參數列表
              

              三、什么是json

              json:是一種輕量級數據交換格式
              

              這里寫圖片描述

              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反射機制
              
              反射機制缺點:初始化對象效率低、擴展性高。
              

              使用反射機制主要是初始化類:
                  第一種用法:調用無參構造函數創建對象  兩行代碼
              
                  // 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);
                      }
              
                      //判斷是否還有下個節點
                      Iterator elementIterator = rootElement.elementIterator();
                      while (elementIterator.hasNext()) {
                          Element next = elementIterator.next();//拿到下個節點
                          getNodes(next);
                      }
              
                  }
              }
              
              點擊復制鏈接 與好友分享!回本站首頁
              上一篇:Java架構學習之線程池使用講解
              下一篇:最后一頁
              相關文章
              圖文推薦
              點擊排行

              關于我們 | 聯系我們 | 廣告服務 | 投資合作 | 版權申明 | 在線幫助 | 網站地圖 | 作品發布 | Vip技術培訓 | 舉報中心

              版權所有: 紅黑聯盟--致力于做實用的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>