美文网首页
web_day11 反射

web_day11 反射

作者: 路人爱早茶 | 来源:发表于2017-09-17 22:44 被阅读0次

    1.xml用在传递数据(大多用json)和配置文件

    • 文档声明必须为<?xmi开头,以7>结束;
      文档声明必须从文档的0行0列位置开始;
      文档声明只有三个属性:
      versioin:指定XML文档版本。必须属性,不会选择1.1(不向下兼容),只会选择1.0;
      encoding:指定当前文档的编码。可选属性,默认值是utf-8
    • xml中符号转化:
    <  &lt
    > &gt
    " &quot
    ' &apos
    & &amp
    --------------
    在cdata区中不会被编译按源码进行
    <![CDATA[
    内容
    ]]>
    

    2.dtd xml文件约束(较少使用)

    • 内部DTD,在XML文档内部嵌入DT D,只对当前XML有效。外部dtd关键字system,公共关键字public
    图片.png 图片.png 图片.png

    3.schema

    • 替代dtd,约束文件和要编写的放在一起
    图片.png
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://www.example.org/web-app_2_5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.example.org/web-app_2_5 web-app_2_5.xsd"
        version="2.5">
        <servlet>
        <servlet-name>name</servlet-name>
        <servlet-class>cn.fb.schmer.Son</servlet-class>
        </servlet>
        <servlet-mapping>
        <servlet-name>name-map</servlet-name>
        <url-pattern>/url1</url-pattern>
        </servlet-mapping>
    </web-app>
    
    图片.png

    4.dom4j解析器

    图片.png
    • 开发中比较常见的解析方式有三种,如下:
      DOM:要求解析器把鸭个XML文档装载到内存,并解析成一个。ocument对象。
      。)优点:元素与元素之间保留结构关系,故可以进行增删改查操作。
      b)缺点:XML文档过大,可能出现内存溢出显现。
      SAX:是一种速度更快,更有效的方法。‘已逐行扫描文档,一边扫描一边解析。并以事件驱动的
      方式进行具体解析,每执行一行,都将触发对应的事件。(了解)
      a)优点:处理速度快,可以处理大文件
      b)缺点:只能读,逐行后将释放资源。
      PULL: Android内置的XML解析方式,类似SAXo(了解)
      常见的解析开发包:
      .JAXP: sun公司提供支持DOM和SAX开发包
      .J Dom:dom4j兄弟
      .jsoup:一种处理H丁ML特定解析开发包
      .dom4j:匕较常用的解析开发包,hibernate底层采用。
    图片.png 图片.png

    ···
    ---------解析xml文件获得class反射路径--------
    @Test
    public void show1(){
    try {
    SAXReader read=new SAXReader();
    Document doc = read.read("src/cn/fb/xml/dom4j/web.xml");
    Element root = doc.getRootElement();
    Element let = root.element("servlet");
    Element classname = let.element("servlet-class");
    Class class1=Class.forName(classname.getText());
    Person son=(Person) class1.newInstance();
    son.init();
    son.body();
    son.destory();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }

    ···

    5.反射

    • 动态创建对象获得方法并执行
    • 三种方法
    Person p = new Person();//创建Peron对象
    Class clazz = p.getClass();
    --------
    Class clazz = Person.class;
    --------------
     Class clazz = Class.forName("cn.itcast.bean.Person");//必须类全名
    -----------------------
    清单1,获取字节码文件中的字段。
    Class clazz = Class.forName("cn.itcast.bean.Person");
    //获取该类中的指定字段。比如age
    Field field = clazz.getDeclaredField("age");//clazz.getField("age");    //为了对该字段进行操作,必须要先有指定类的对象。
    Object obj = clazz.newInstance();
        //对私有访问,必须取消对其的访问控制检查,使用AccessibleObject父类中的setAccessible的方法
    field.setAccessible(true);//暴力访问。尽量不要访问私有   
    field.set(obj, 789);
        //获取该字段的值。
    Object o = field.get(obj);
    System.out.println(o);
    备注:getDeclaredField:获取所有属性,包括私有。
      getField:获取公开属性,包括从父类继承过来的,不包括非公开方法。
    清单2,获取字节码文件中的方法。
    //根据名称获取其对应的字节码文件对象
    Class clazz = Class.forName("cn.itcast.bean.Person");
    //调用字节码文件对象的方法getMethod获取class对象所表示的类的公共成员方法(指定方法),参数为方法名和当前方法的参数,无需创建对象,它是静态方法
    Method method = clazz.getMethod("staticShow", null);
    //调用class对象所表示的类的公共成员方法,需要指定对象和方法中的参数列表
    method.invoke(null, null);
    ………………………………………………………………………………………………………
    Class clazz = Class.forName("cn.itcast.bean.Person");   
        //获取指定方法。
    Method method = clazz.getMethod("publicShow", null);
        //获取指定的类对象。 
    Object obj = clazz.newInstance();
    method.invoke(obj, null);//对哪个对象调用方法,是参数组
    好处:大大的提高了程序的扩展性。
    

    相关文章

      网友评论

          本文标题:web_day11 反射

          本文链接:https://www.haomeiwen.com/subject/xjvusxtx.html