解析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. RDCの自我介绍

    ........................................... 大家好,这里是RUSH_D_CAT.一只ACMer,19岁的少年,From SDU,大二. Q: 1950499 ...

  2. Alamofire源码解读系列(十二)之时间轴(Timeline)

    本篇带来Alamofire中关于Timeline的一些思路 前言 Timeline翻译后的意思是时间轴,可以表示一个事件从开始到结束的时间节点.时间轴的概念能够应用在很多地方,比如说微博的主页就是一个 ...

  3. Android中java层使用LocalSocket和底层进行通讯

    原始文件:frameworks\base\services\java\com\android\server\NativeDaemonConnector.java private void listen ...

  4. jsp的开发模式

    JSP 存在两种 开发模式1.Model1 : JSP + JavaBean * 不适合开发业务逻辑特别复杂web应用 ----- 业务逻辑复杂,控制代码多,而在jsp中编写控制代码,十分不便 *JS ...

  5. TabBar自定义方式(一)

    1.思路:创建一个继承UIView的TabBar类,并将需要的item添加到TabBar上面去,并用代理来处理相应的时间 [self.view bringSubviewToFront:self.one ...

  6. MYSQL PGA SGA设置

    mysql使用总内存 = global_buffers + thread_buffers All thread buffer(会话/线程级内存分配总和) = max_threads(当前活跃连接数)  ...

  7. mysql常用技能分享

    一,MySQL查询的五种子句: 1,where(条件查询),常用的运算符: ①比较运算符 > , < , = , != , >= , <= , in( ) , between ...

  8. MyRocks DDL原理

    最近一个日常实例在做DDL过程中,直接把数据库给干趴下了,问题还是比较严重的,于是赶紧排查问题,撸了下crash堆栈和alert日志,发现是在去除唯一约束的场景下,MyRocks存在一个严重的bug, ...

  9. node express安装

    我们现在全局安装只需要安装这个命令行工具就可以,指令如下: npm install -g express-generator 这时我们就着手安装express框架,指令如下: express blog ...

  10. CSAcademy Beta Round #3 a-game

    题目连接 a-game 大意:有一个只包含A和B的字符串,两个人分别取这个串的子串,但是每一次取不能与之前取到过的子串有交集,最后谁取到的所有串中A的总数量少的判为胜.如果一样,则为平手. 给出这样的 ...