解析XML总结(SAX、Pull、Dom三种方式)

图一 XML的解析方式

图二 XML的Schema的约束

反射的简单介绍:

反射

1、什么是反射技术?

动态获取指定类以及类中的内容(成员),并运行其内容。

应用程序已经运行,无法在其中进行new对象的建立,就无法使用对象。这时可以根据配置文件的类全名去找对应的字节码文件,并加载进内存,并创建该类对象实例。这就需要使用反射技术完成

2、获取class对象的三种方式

获取Class对象的方式一:

通过对象具备的getClass方法(源于Object类的方法)。有点不方便,需要用到该类,并创建该类的对象,再调用getClass方法完成。

Person p = new Person();//创建Peron对象

Class clazz = p.getClass();//通过object继承来的方法(getClass)获取Person对应的字节码文件对象

获取Class对象的方式二:

每一个类型都具备一个class静态属性,通过该属性即可获取该类的字节码文件对象。比第一种简单了一些,仅用一个静态属性就搞定了。但是,还是有一点不方便,还必须要使用到该类。

Class clazz = Person.class;

获取Class对象方式三:

* 去找找Class类中是否有提供获取的方法呢?

* 找到了,static Class forName(className);

* 相对方便的多,不需要直接使用具体的类,只要知道该类的名字即可。

* 而名字完成可以作为参数进行传递 ,这样就可以提高扩展性。

* 所以为了动态获取一个类,第三种方式最为常用。

Class clazz = Class.forName("cn.itcast.bean.Person");//必须类全名

创建Person对象的方式

以前:1,先加载cn.itcast.bean.Person类进内存。

2,将该类封装成Class对象。

3,根据Class对象,用new操作符创建cn.itcast.bean.Person对象。

4,调用构造函数对该对象进行初始化。

cn.itcast.bean.Person p = new cn.itcast.bean.Person();

通过方式三:(此外还可以使用构造,构造可以指定参数---如String.class)

String className = "cn.itcast.bean.Person";

//1,根据名称获取其对应的字节码文件对象

1,通过forName()根据指定的类名称去查找对应的字节码文件,并加载进内存。

2,并将该字节码文件封装成了Class对象。

3,直接通过newIntstance方法,完成该对象的创建。

4,newInstance方法调用就是该类中的空参数构造函数完成对象的初始化。

Class clazz = Class.forName(className);

//2,通过Class的方法完成该指定类的对象创建。

Object object = clazz.newInstance();//该方法用的是指定类中默认的空参数构造函数完成的初始化。

清单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);//对哪个对象调用方法,是参数组

好处:大大的提高了程序的扩展性。

通过读取配置文件的方式来使用反射完成对实例对象方法调用

案例一:

public void testMyServlet(){
  try {
    //1.创建解析器对象
    SAXReader saxReader = new SAXReader();
    //2.使用解析器加载web.xml文件得到document对象
    Document document = saxReader.read("src/cn/itheima/web/servlet1/web.xml");
    //3.获取根元素节点
    Element rootElement = document.getRootElement();
    //4.根据元素名称获取子元素节点
    Element servletElement = rootElement.element("servlet");
    //5.根据元素名称获取servlet-class的文本节点
    String servletClass = servletElement.element("servlet-class").getText();
    //System.out.println(servletClass);
    //6.通过类全名获取字节码文件
    Class clazz = Class.forName(servletClass);
    //7.创建实例对象
    MyServlet1 my = (MyServlet1) clazz.newInstance();
    //8.调用实例对象里面的方法
    my.init();
    my.service();
    my.destory();
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
  }
}

案例二,模拟浏览器路径:

public class TestMyServlet2 {

//8.创建一个map集合

private HashMap<String, String> data = new HashMap<String,String>();

@Before

public void testReadWEBXml(){

try {

//1.创建解析器对象

SAXReader saxReader = new SAXReader();

//2.使用解析器加载web.xml文件得到document对象

Document document = saxReader.read("src/cn/itheima/web/servlet1/web.xml");

//3.获取根元素节点

Element rootElement = document.getRootElement();

//4.获取子节点(servlet和servlet-mapping)

List<Element> childElements = rootElement.elements();

//5.遍历

for (Element element : childElements) {

//6.判断元素的名称为servlet的元素节点

if("servlet".equals(element.getName())){

//7.分别获取servlet元素节点的servlet-name和servlet-class的值

String servletName = element.element("servlet-name").getText();

String servletClass = element.element("servlet-class").getText();

/*System.out.println(servletName);

System.out.println(servletClass);*/

data.put(servletName, servletClass);

}

//9.判断元素的名称为servlet-mapping的元素节点

if("servlet-mapping".equals(element.getName())){

//10.分别获取servlet元素节点的servlet-name和servlet-class的值

String servletName = element.element("servlet-name").getText();

String urlPattern = element.element("url-pattern").getText();

//11.将servletName作为key来获取servletClass的值

String servletClass = data.get(servletName);

//12.将url-pattern作为key,servletClass作为value存到map中去

data.put(urlPattern, servletClass);

//13.移除servletName

data.remove(servletName);

}

}

//System.out.println(data);

} catch (DocumentException e) {

e.printStackTrace();

}

}

@Test

public void testMyServlet(){

try {

//1.模拟在浏览器输入一个url

String url1 = "/myServlet2";

//2.将urlPattern作为key来获取servletClass

String className = data.get(url1);

//3.通过servletClass获取字节码文件

Class clazz = Class.forName(className);

//4.通过字节码文件创建实例对象

Object obj = clazz.newInstance();

//5.通过字节码文件获取方法(两个参数:第一个是方法名称;第二个参数是方法的参数)

Method method = clazz.getMethod("service", null);

//6.调用invoke方法执行实例对象里面的方法(前面写的方法init)【两个参数:第一个是调用方法的实例对象,第二个是方法的实参】

method.invoke(obj, null);

} catch (Exception e) {

e.printStackTrace();

}

}

}

【JAVAWEB学习笔记】11_XML&反射的更多相关文章

  1. JavaWeb学习笔记总结 目录篇

    JavaWeb学习笔记一: XML解析 JavaWeb学习笔记二 Http协议和Tomcat服务器 JavaWeb学习笔记三 Servlet JavaWeb学习笔记四 request&resp ...

  2. javaweb学习笔记整理补课

    javaweb学习笔记整理补课 * JavaWeb: * 使用Java语言开发基于互联网的项目 * 软件架构: 1. C/S: Client/Server 客户端/服务器端 * 在用户本地有一个客户端 ...

  3. 【JAVAWEB学习笔记】06_jQuery基础

    接05的学习笔记. 四.使用JQ完成省市二级联动 1.需求分析 使用jquery完成省市二级联动 2.技术分析 2.1数组的遍历操作 方式一: $(function(){ // 全选/ 全不选 $(& ...

  4. javaweb学习笔记(二)

    一.javaweb学习是所需要的细节 1.Cookie的注意点 ① Cookie一旦创建,它的名称就不能更改,Cookie的值可以为任意值,创建后允许被修改. ② 关于Cookie中的setMaxAg ...

  5. Javaweb学习笔记(一)

    一.javaweb学习是所需要的细节 1.发送响应头相关的方法 1).addHeader()与setHeader()都是设置HTTP协议的响应头字段,区别是addHeader()方法可以增加同名的响应 ...

  6. 【JAVAWEB学习笔记】11_XML

    今日内容介绍 编写服务器软件,访问指定配置内容 访问tomcat下已经发布的web项目 今日内容学习目标 可以编写xml存放任意内容 通过DTD约束编写指定格式的XML 通过Schema约束编写指定格 ...

  7. Javaweb学习笔记——(二十七)——————泛型、泛型的通配符、反射泛型信息、反射注解、注解

    泛型     1.泛型类:具有一个或多个类型变量的类,称之为泛型类 class A<T>{ } 2.在创建泛型实例时,需要为其类型变量赋值 A<String> a = new ...

  8. Javaweb学习笔记——(七)——————myexlipse基本使用、jdk5.0新特性及反射讲解

    1.debug调试模式: *使用这种模式,调试程序(看到程序运行停止在这一行) -显示出来行号 -双击左边,出现一个圆点,表示设置了一个断点 *使用debug as方式,运行程序 -特使是否进入到调试 ...

  9. Javaweb学习笔记——(二十一)——————过滤器

    过滤器     过滤器概述         1.什么是过滤器:             过滤器javaweb三大组件之一,它与Serlvet很相似,不过它过滤器是用来拦截请求的,而不是处理       ...

随机推荐

  1. div内部元素居中

    要让div内部元素垂直居中,则给div加上此css样式: .div-vertical-middle{  height:200px;  width:304px;  line-height:50px;  ...

  2. Swift开发

    1. 模糊效果 iconImageView.image = UIImage(named: "1.png") //效果类实例 let blurEffect = UIBlurEffec ...

  3. GEF开发eclipse插件,多页编辑器实现delete功能

    基于GEF开发,多页签编辑器实现 有两种方案: 方案一 继承FormEditor或MultiPageEditorPart,在其中嵌入自定义的继承自GraphicalEditor的子类的编辑器(作为一个 ...

  4. 1163: 零起点学算法70——Yes,I can!

    1163: 零起点学算法70--Yes,I can! Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: ...

  5. java 基础知识七 装箱和拆箱

    java  基础知识七  装箱和拆箱 数据类型可分为两大种,基本数据类型(值类型)和类类型(引用数据类型) 装箱:把基本类型用他们相对应的引用类型包装起来,使他们可以具有对象的特质    基本数据类型 ...

  6. stm32串口通讯问题

    stm32串口通讯问题 在串口试验中,串口通讯不正常,则可能会出现以下问题: 1. 配置完成后,串口没有任何消息打印. 原因:1,端口配置有问题,需要重新检查I/O口的配置 2,接线有问题,检查接线是 ...

  7. 详细了解 int? 类型

    一.int?是什么 二.了解Nullable结构体 三.Nullable类型的取值与转换 1.GetValueOrDefault 2.运算符重载 一.int?是什么 说到int?,或者double?, ...

  8. oracle导入时提示IMP-00010:不是有效的导出文件,头部验证失败

    oracle导入时提示IMP-00010:不是有效的导出文件,头部验证失败: 原因分析:导出的oracle的版本与导入的oracle数据库的版本不一致: 可直接将dmp文件用notepad++打开修改 ...

  9. 文本处理sed常用操作

    文本处理sed常用操作 linux sed (stream editor) is a Unix utility that parses and transforms text, using a sim ...

  10. App内切换语言

    前几天客户提需求,对App增加一个功能,这个功能目前市面上已经很常见,那就是应用内切换语言.啥意思,就是 英.中.法.德.日...语言随意切换. (本案例采用Data-Bingding模式,麻麻再也不 ...