Java架构学习(六)jason&fastjson解析&xml使用&dom4j解析&java反射机制&手写SpringIOC框架

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

一、什么是数据交换格式

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

二、JSON数据交换格式

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

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


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

三、什么是json

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

Java架构学习(六)jason&fastjson解析&xml使用&dom4j解析&java反射机制&手写SpringIOC框架_第1张图片

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架构基础学习一)