• 我相信“交警雨中护送高考生”是真,“交警雨中护送高考生”反被该高考生家长投诉是假。 2019-04-16
  • 14名消防员日巡逻28公里 洗冷水澡 2019-04-10
  • 靶壕有了“蓝军”,百发百中的“神枪手”练起来 2019-04-10
  • 不是秀强大了,别人就会来做朋友,这逻辑不对 2019-04-01
  • 候选企业:中国石油呼和浩特石化公司 2019-03-26
  • 航天员沙漠野外生存训练完美收官!为第一天团打call 2019-03-25
  • 请问,建立市场经济后,原计划经济哪里去?改革后,我们还在实行计划经济,为何没有提及? 2019-03-25
  • 构建年轻干部梯次培养链 2019-03-19
  • 孙实的专栏作者中国国家地理网 2019-03-15
  • 湖南师范大学举行研究阐释党的十九大精神国家社科基金重大专项学术研讨会 2019-03-15
  • [雷人]蠢货!土地处于不同的城市和地段,关联的资源不一样,价值也不一样。不然给咱俩同样面积的土地,咱的在北上广深,你的在边远山区,你干么? 2019-03-08
  • 国际社会持续热议上合青岛峰会:上合组织发展进入新阶段 彰显中国领导力 2019-03-08
  • 珍惜野生动物频现甘孜境内 生态环境质量不断提升 2019-03-06
  • "新经济形势下金融创新的变革与机遇"论坛 2019-03-06
  • 频道栏目
    神奇公式秒杀全国11选5 > 程序开发 > 软件开发 > Java > 正文
    Java架构学习之jason、fastjson解析、xml使用、dom4j解析、java反射机制及手写SpringIOC框架实例讲解
    2018-07-27 13:52:10         来源:Leeue李月  
    收藏   我要投稿

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

    一、什么是数据交换格式

     神奇公式秒杀全国11选5 www.2zfa.com 
    客户端常用的数据交换格式有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技术培训 | 神奇公式秒杀全国11选5

    版权所有: 神奇公式秒杀全国11选5--致力于做实用的IT技术学习网站

  • 我相信“交警雨中护送高考生”是真,“交警雨中护送高考生”反被该高考生家长投诉是假。 2019-04-16
  • 14名消防员日巡逻28公里 洗冷水澡 2019-04-10
  • 靶壕有了“蓝军”,百发百中的“神枪手”练起来 2019-04-10
  • 不是秀强大了,别人就会来做朋友,这逻辑不对 2019-04-01
  • 候选企业:中国石油呼和浩特石化公司 2019-03-26
  • 航天员沙漠野外生存训练完美收官!为第一天团打call 2019-03-25
  • 请问,建立市场经济后,原计划经济哪里去?改革后,我们还在实行计划经济,为何没有提及? 2019-03-25
  • 构建年轻干部梯次培养链 2019-03-19
  • 孙实的专栏作者中国国家地理网 2019-03-15
  • 湖南师范大学举行研究阐释党的十九大精神国家社科基金重大专项学术研讨会 2019-03-15
  • [雷人]蠢货!土地处于不同的城市和地段,关联的资源不一样,价值也不一样。不然给咱俩同样面积的土地,咱的在北上广深,你的在边远山区,你干么? 2019-03-08
  • 国际社会持续热议上合青岛峰会:上合组织发展进入新阶段 彰显中国领导力 2019-03-08
  • 珍惜野生动物频现甘孜境内 生态环境质量不断提升 2019-03-06
  • "新经济形势下金融创新的变革与机遇"论坛 2019-03-06