【JAVAWEB学习笔记】11_XML&反射














解析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&反射的更多相关文章
- JavaWeb学习笔记总结 目录篇
JavaWeb学习笔记一: XML解析 JavaWeb学习笔记二 Http协议和Tomcat服务器 JavaWeb学习笔记三 Servlet JavaWeb学习笔记四 request&resp ...
- javaweb学习笔记整理补课
javaweb学习笔记整理补课 * JavaWeb: * 使用Java语言开发基于互联网的项目 * 软件架构: 1. C/S: Client/Server 客户端/服务器端 * 在用户本地有一个客户端 ...
- 【JAVAWEB学习笔记】06_jQuery基础
接05的学习笔记. 四.使用JQ完成省市二级联动 1.需求分析 使用jquery完成省市二级联动 2.技术分析 2.1数组的遍历操作 方式一: $(function(){ // 全选/ 全不选 $(& ...
- javaweb学习笔记(二)
一.javaweb学习是所需要的细节 1.Cookie的注意点 ① Cookie一旦创建,它的名称就不能更改,Cookie的值可以为任意值,创建后允许被修改. ② 关于Cookie中的setMaxAg ...
- Javaweb学习笔记(一)
一.javaweb学习是所需要的细节 1.发送响应头相关的方法 1).addHeader()与setHeader()都是设置HTTP协议的响应头字段,区别是addHeader()方法可以增加同名的响应 ...
- 【JAVAWEB学习笔记】11_XML
今日内容介绍 编写服务器软件,访问指定配置内容 访问tomcat下已经发布的web项目 今日内容学习目标 可以编写xml存放任意内容 通过DTD约束编写指定格式的XML 通过Schema约束编写指定格 ...
- Javaweb学习笔记——(二十七)——————泛型、泛型的通配符、反射泛型信息、反射注解、注解
泛型 1.泛型类:具有一个或多个类型变量的类,称之为泛型类 class A<T>{ } 2.在创建泛型实例时,需要为其类型变量赋值 A<String> a = new ...
- Javaweb学习笔记——(七)——————myexlipse基本使用、jdk5.0新特性及反射讲解
1.debug调试模式: *使用这种模式,调试程序(看到程序运行停止在这一行) -显示出来行号 -双击左边,出现一个圆点,表示设置了一个断点 *使用debug as方式,运行程序 -特使是否进入到调试 ...
- Javaweb学习笔记——(二十一)——————过滤器
过滤器 过滤器概述 1.什么是过滤器: 过滤器javaweb三大组件之一,它与Serlvet很相似,不过它过滤器是用来拦截请求的,而不是处理 ...
随机推荐
- RDCの自我介绍
........................................... 大家好,这里是RUSH_D_CAT.一只ACMer,19岁的少年,From SDU,大二. Q: 1950499 ...
- Alamofire源码解读系列(十二)之时间轴(Timeline)
本篇带来Alamofire中关于Timeline的一些思路 前言 Timeline翻译后的意思是时间轴,可以表示一个事件从开始到结束的时间节点.时间轴的概念能够应用在很多地方,比如说微博的主页就是一个 ...
- Android中java层使用LocalSocket和底层进行通讯
原始文件:frameworks\base\services\java\com\android\server\NativeDaemonConnector.java private void listen ...
- jsp的开发模式
JSP 存在两种 开发模式1.Model1 : JSP + JavaBean * 不适合开发业务逻辑特别复杂web应用 ----- 业务逻辑复杂,控制代码多,而在jsp中编写控制代码,十分不便 *JS ...
- TabBar自定义方式(一)
1.思路:创建一个继承UIView的TabBar类,并将需要的item添加到TabBar上面去,并用代理来处理相应的时间 [self.view bringSubviewToFront:self.one ...
- MYSQL PGA SGA设置
mysql使用总内存 = global_buffers + thread_buffers All thread buffer(会话/线程级内存分配总和) = max_threads(当前活跃连接数) ...
- mysql常用技能分享
一,MySQL查询的五种子句: 1,where(条件查询),常用的运算符: ①比较运算符 > , < , = , != , >= , <= , in( ) , between ...
- MyRocks DDL原理
最近一个日常实例在做DDL过程中,直接把数据库给干趴下了,问题还是比较严重的,于是赶紧排查问题,撸了下crash堆栈和alert日志,发现是在去除唯一约束的场景下,MyRocks存在一个严重的bug, ...
- node express安装
我们现在全局安装只需要安装这个命令行工具就可以,指令如下: npm install -g express-generator 这时我们就着手安装express框架,指令如下: express blog ...
- CSAcademy Beta Round #3 a-game
题目连接 a-game 大意:有一个只包含A和B的字符串,两个人分别取这个串的子串,但是每一次取不能与之前取到过的子串有交集,最后谁取到的所有串中A的总数量少的判为胜.如果一样,则为平手. 给出这样的 ...