頻道欄目
首頁 > 程序開發 > 軟件開發 > 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架構學習之線程池使用講解
下一篇:Java環境變量配置方法(Windows)
相關文章
圖文推薦
點擊排行

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

版權所有: 紅黑聯盟--致力于做實用的IT技術學習網站

加拿大28火车判定方法