解析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. juddi学习一

    一.下载juddi 地址:https://mirrors.tuna.tsinghua.edu.cn/apache/juddi/juddi/3.3.4/ 二. 解压下载文件打开目录下的 进入bin目录, ...

  2. laravel资源路由详解

    大概挑两条解释. 我定义了个资源路由Route::resource('article', 'ArticleController');. 当我访问地址ArticleController的http://y ...

  3. 老李分享:jvm内存原型剖析

    老李分享:jvm内存原型剖析   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:9088214 ...

  4. Spring基础学习(三)—详解Bean(下)

    一.Bean的生命周期 1.概述      Spring IOC容器可以管理Bean的生命周期,Spring 允许在Bean的生命周期的特定点执行定制的任务.      Spring IOC容器对Be ...

  5. 用java写的一个程序,可以调用windows系统中自带的各种工具,例如截图,便签等

    由于图片资源没有上传,所以运行后不会有图片,感兴趣的同学可以@我,我打包上传, package SmallPrograme; import java.awt.*; import java.awt.ev ...

  6. 爬虫入门系列(二):优雅的HTTP库requests

    在系列文章的第一篇中介绍了 HTTP 协议,Python 提供了很多模块来基于 HTTP 协议的网络编程,urllib.urllib2.urllib3.httplib.httplib2,都是和 HTT ...

  7. java代码开发完成后,代码走查规范

    代码走查注意事项: 1.不变的值,尽量写个常量类 2.尽量使用if{}else,不要一直if去判断 3.减少循环调用方法查询数据库 4.dao层尽量不要用逻辑,尽量在service里写业务逻辑 5.金 ...

  8. Linux:一位猫奴的意外产物

    作者:Vamei,严禁任何形式转载. 1991年年中,林纳斯·托瓦兹(Linus Torvalds)在自己房间里敲着键盘.他全神贯注地盯着14寸的黑色屏幕,都没感觉到自己的小猫Randi在扒自己的裤腿 ...

  9. 读《effective C++》2

    条款03:尽可能使用const(Use const whenever possible) 1.const == 奇妙的事 const的一件奇妙的事是,他允许你定义一个约束,(告诉编译器,这是一个“不该 ...

  10. angular购物车

    <body ng-app> <div class="container" ng-controller="carController"> ...