XML和反射
来源:互联网 发布:手机选号软件 编辑:程序博客网 时间:2024/06/06 05:26
1、XML是可扩展标记语言。
必须以<?xml version="1.0" ?>
开头
CDATA区:
<![CDATA[ 任意内容]]>
2、DTD约束xml
通过”web-app_2_3.dtd”编写XML
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE web-app SYSTEM "web-app_2_3.dtd"><web-app version="1.0"> <servlet> <servlet-name></servlet-name> <servlet-class></servlet-class> </servlet> <servlet-mapping> <servlet-name></servlet-name> <url-pattern></url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file></welcome-file> </welcome-file-list></web-app>
3、Schema约束
Schema的扩展名为xsd。常见的框架有Spring。
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://www.example.org/web-app_2_5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/web-app_2_5 web-app_2_5.xsd" version="2.5"> <servlet> <servlet-name>helloServlet</servlet-name> <servlet-class>xxxxxxxxxx</servlet-class> </servlet> <servlet-mapping> <servlet-name>helloServlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping></web-app>
4、XML解析
try { // 1.获取解析器 SAXReader saxReader = new SAXReader(); // 2.获得document文档对象 Document doc = saxReader.read("src/cn/xml/web.xml"); // 3.获取根元素 Element rootElement = doc.getRootElement(); // System.out.println(rootElement.getName());//获取根元素的名称 // System.out.println(rootElement.attributeValue("version"));//获取根元素中的属性值 // 4.获取根元素下的子元素 List<Element> childElements = rootElement.elements(); // 5.遍历子元素 for (Element element : childElements) { //6.判断元素名称为servlet的元素 if ("servlet".equals(element.getName())) { //7.获取servlet-name元素 Element servletName = element.element("servlet-name"); //8.获取servlet-class元素 Element servletClass = element.element("servlet-class"); System.out.println(servletName.getText()); System.out.println(servletClass.getText()); } }} catch (DocumentException e) { e.printStackTrace();}
5、反射
什么是反射技术?
动态获取指定类以及类中的内容(成员),并运行其内容。
5.1、获取class对象的三种方式
方式一:
通过对象具备的getClass方法(源于Object类的方法)。有点不方便,需要用到该类,并创建该类的对象,再调用getClass方法完成。
Person p = new Person();//创建Peron对象Class clazz = p.getClass();//通过object继承来的方法(getClass)获取Person对应的字节码文件对象
方式二:
每一个类型都具备一个class静态属性,通过该属性即可获取该类的字节码文件对象。比第一种简单了一些,仅用一个静态属性就搞定了。但是,还是有一点不方便,还必须要使用到该类。
Class clazz = Person.class;
方式三:
所以为了动态获取一个类,第三种方式最为常用。
Class clazz = Class.forName("cn.bean.Person");//必须类全名
接着创捷对象:
String className = "cn.bean.Person";//1,根据名称获取其对应的字节码文件对象Class clazz = Class.forName(className);//2newInstance方法调用就是该类中的空参数构造函数完成对象的初始化。Object object = clazz.newInstance();//该方法用的是指定类中默认的空参数构造函数完成的初始化。
获取字节码文件中的字段:
Class clazz = Class.forName("cn.bean.Person");//获取该类中的指定字段。比如ageField 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:获取公开属性,包括从父类继承过来的,不包括非公开方法。
获取字节码文件中的方法:
//根据名称获取其对应的字节码文件对象Class clazz = Class.forName("cn.bean.Person");//调用字节码文件对象的方法getMethod获取class对象所表示的类的公共成员方法(指定方法),参数为方法名和当前方法的参数,无需创建对象,它是静态方法Method method = clazz.getMethod("staticShow", null);//调用class对象所表示的类的公共成员方法,需要指定对象和方法中的参数列表method.invoke(null, null);
Class clazz = Class.forName("cn.bean.Person"); //获取指定方法。Method method = clazz.getMethod("publicShow", null);//获取指定的类对象。 Object obj = clazz.newInstance();method.invoke(obj, null);//对哪个对象调用方法,是参数组
好处:大大的提高了程序的扩展性。
5.2、反射代码
定义接口:
public interface IMyServlet { public void init(); public void service(); public void destory();}
实现接口:
public class MyServletImpl implements IMyServlet { @Override public void init() { System.out.println("啊,俺来也……"); } @Override public void service() { System.out.println("我可以为你服务……"); } @Override public void destory() { System.out.println("啊,俺去也……"); }}
反射:
try { String className = "cn.servlet.MyServletImpl"; Class clazz = Class.forName(className); MyServletImpl my = (MyServletImpl) clazz.newInstance(); my.init(); my.service(); my.destory();} catch (Exception e) { e.printStackTrace();}
6、模拟服务器
web.xml
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://www.example.org/web-app_2_5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/web-app_2_5 web-app_2_5.xsd" version="2.5"> <servlet> <servlet-name>MyServlet1</servlet-name> <servlet-class>cn.web.servlet1.MyServlet1</servlet-class> </servlet> <servlet-mapping> <servlet-name>MyServlet1</servlet-name> <url-pattern>/myServlet1</url-pattern> </servlet-mapping> <servlet> <servlet-name>MyServlet2</servlet-name> <servlet-class>cn.web.servlet1.MyServlet2</servlet-class> </servlet> <servlet-mapping> <servlet-name>MyServlet2</servlet-name> <url-pattern>/myServlet2</url-pattern> </servlet-mapping></web-app>
两个实现类:
public class MyServlet1 implements IMyServlet{ @Override public void init() { System.out.println("MyServlet1诞生了……"); } @Override public void service() { System.out.println("MyServlet1开始服务了……"); } @Override public void destory() { System.out.println("MyServlet1销毁了……"); }}
public class MyServlet2 implements IMyServlet{ @Override public void init() { System.out.println("MyServlet2诞生了……"); } @Override public void service() { System.out.println("MyServlet2开始服务了……"); } @Override public void destory() { System.out.println("MyServlet2销毁了……"); }}
调用:
try { //1.创建解析器对象 SAXReader saxReader = new SAXReader(); //2.使用解析器加载web.xml文件得到document对象 Document document = saxReader.read("src/cn/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();}
//8.创建一个map集合private HashMap<String, String> data = new HashMap<String,String>();@Beforepublic void testReadWEBXml(){ try { //1.创建解析器对象 SAXReader saxReader = new SAXReader(); //2.使用解析器加载web.xml文件得到document对象 Document document = saxReader.read("src/cn/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(); }}@Testpublic 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(); }}
阅读全文
0 0
- XML和反射
- 利用反射和递归生成xml元素
- XML&反射
- 练习:通过解析xml和java反射机制实现IoC
- 反射配对儿XML
- XML反射解析
- 反射方式解析xml
- Android UI : XML & 反射
- Android开发之XML反射
- xml+反射dom解析案例
- XML解析 反射成为对象
- Java反射xml数据到类中
- 使用Java反射创建XML
- 利用反射与dom4j读取javabean生成对应XML和读取XML得到对应的javabean对象集合
- 利用反射与dom4j读取javabean生成对应XML和读取XML得到对应的javabean对象集合
- 利用反射与dom4j读取javabean生成对应XML和读取XML得到对应的javabean对象集合
- 利用java反射 和 Dom4j 写的通用xml解析器
- SSH框架学习语录二:关注框架都有的xml配置文件和反射
- 将DataGrid中所有选中项转换为自定义model的方法
- RecyclerView系列之(3):添加下拉刷新和上拉加载更多
- CAS(Compare and Swap)算法
- 成绩排序,元素删除,冒泡排序,快速排序,判断素数,判断字符,求利润,定义类
- Python入门(一)——IDE选择,输入输出,类型规范,转义序列,格式问题,标识符
- XML和反射
- pycharm中安装第三方软件库
- input type=number 去掉输入框中的上下箭头
- 自我介绍
- solr home目录结构
- ATOM 编辑器使用心得
- HDU 1421 搬寝室
- 多线程(2)
- 车型数据重要性-汽车保养售后配件匹配数据库(机油 变速箱 滤清器 雨刷 大灯 刹车片)