web_day11 反射

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

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

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

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

3.schema

  • 替代dtd,约束文件和要编写的放在一起
图片.png


    
    name
    cn.fb.schmer.Son
    
    
    name-map
    /url1
    

web_day11 反射_第2张图片
图片.png

4.dom4j解析器

web_day11 反射_第3张图片
图片.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
web_day11 反射_第4张图片
图片.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 反射)