Tomcat解析XML和反射创建对象原理

 import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List; import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; public class ServerReadXML1 { public static void main(String[] args)
throws DocumentException, ClassNotFoundException, InstantiationException, IllegalAccessException,
NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException { // 现在假如在浏览器中输入一个Servlet的url-pattern
String urlPattern = "/first"; // 根据urlPattern 获取类名
String className = getClassByUrl(urlPattern); // 根据全类名获取Class对象
Class clazz = Class.forName(className); // 通过反射clazz对象创建指定对象
Object obj = clazz.newInstance(); // 获取service方法
Method method = clazz.getDeclaredMethod("service"); // 获取权限
method.setAccessible(true); // 执行service方法
method.invoke(obj); } private static String getClassByUrl(String urlPattern) throws DocumentException { // 1.创建SAXReader对象
SAXReader reader = new SAXReader(); // 2.读取文件
Document document = reader.read(ServerReadXML1.class.getClassLoader().getResourceAsStream("web.xml")); // 3.获取根节点
Element rootElement = document.getRootElement();
//System.out.println(rootElement.getName()); // 4.获取根节点下 的子节点
List<Element> servletList = rootElement.elements(); // 记录与urlPattern相同的servlet-name标签的内容
String servletName = ""; // 记录servlet标签中的servlet-class的内容
// servletClassName的内容也就是Servlet的全类名
String servletClassName = ""; // 5.遍历子节点
for (Element servletElement : servletList) {
//System.out.println(servletElement.getName()); // 判断如果是servlet-mapping标签时,执行代码
if ("servlet-mapping".equals(servletElement.getName())) { // 获取url-pattern标签对象
Element url = servletElement.element("url-pattern"); // 判断标签的内容和入的urlPattern值是否相同
if (urlPattern.equals(url.getText())) { // 记录与urlPattern相同的servlet-name标签的内容
// 如果相同,则记录ServletName
// 获取servlet-mapping中的servelt-name的内容
servletName = servletElement.element("servlet-name").getText(); } } } // 再次遍历
for (Element servletElement : servletList) {
// 判断如果是servlet标签时,执行此代码
if ("servlet".equals(servletElement.getName())) { // 判断上一次的遍历获取的servletName的值和这次遍历中的servlet-name的内容是否相同
if (servletName.equals(servletElement.element("servlet-name").getText())) { // 如果相同记录servletClassName
servletClassName = servletElement.element("servlet-class").getText(); } } } // 返回Servlet的全类名 servletClassName
return servletClassName;
} }

1.反射的获取Class 4种方式

@Test
public void test1() throws ClassNotFoundException { //1.类名.class
Class clazz = String.class;
System.out.println(clazz); //2.对象.getClass()
Class clazz1 = "abc".getClass();
System.out.println(clazz1); //3.Class.forName();
Class clazz2 = Class.forName("java.lang.String");
System.out.println(clazz2); //4.ClassLoader .loadClass("全类名")
Class clazz3 = ReflectTest1.class.getClassLoader().loadClass("java.lang.String");
System.out.println(clazz3); }

2.反射使用属性的常用方法

@Test
public void test2() throws ClassNotFoundException, NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { //获取Class对象 可以获取其内部的属性
Class clazz = Class.forName("com.atguigu.bean.User"); User user = new User(); //Field对象 代表中类的属性 getField只能获取公共属性
Field field = clazz.getField("email");
System.out.println(field); //此种方式破坏代码的封装性 不推荐使用
Field field2 = clazz.getDeclaredField("id");
System.out.println(field2); field2.setAccessible(true);
field2.setInt(user, );
System.out.println(user); }

3.反射使用方法的常用方法

@Test
public void test3() throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException { Class clazz = Class.forName("com.atguigu.bean.User"); //通过反射创建对象
Object obj = clazz.newInstance(); //现在想要设置name值
String fileName = "name"; //创建一个方法名
String methodName = "set" + fileName.substring(, ).toUpperCase() //N
+ fileName.substring().toLowerCase(); //ame //根据方法名 获取公共方法
Method method = clazz.getMethod(methodName, String.class); //执行指定的方法
method.invoke(obj, "yangjian"); System.out.println(obj);
}

Tomcat解析XML和反射创建对象原理的更多相关文章

  1. Qt中三种解析xml的方式

    在下面的随笔中,我会根据xml的结构,给出Qt中解析这个xml的三种方式的代码.虽然,这个代码时通过调用Qt的函数实现的,但是,很多开源的C++解析xml的库,甚至很多其他语言解析xml的库,都和下面 ...

  2. Digester解析xml原理

    Tomcat内部是使用Digester来解析xml文件的,将xml转化为java对象. digester底层是基于SAX+事件驱动+栈的方式来搭建实现的,SAX主要用来解析xml,事件驱动主要是在解析 ...

  3. 在tomcat启动时解析xml文件,获取特定标签的属性值,并将属性值设置到静态变量里

    这里以解析hibernate.cfg.xml数据库配置信息为例,运用dom4j的解析方式来解析xml文件. 1.在javaWeb工程里新建一个java类,命名为GetXmlValue.java,为xm ...

  4. Java反射——读取XML文件,创建对象

    读取XML文件,创建对象 config.xml <?xml version="1.0" encoding="UTF-8"?> <beans&g ...

  5. .NET解析xml字符串,通过反射给实体类对象赋值,获取实体类数据列表

    /// <summary> /// 解析xml字符串 转换为实体类列表数据 /// </summary> /// <param name="xmlStr&quo ...

  6. Spring中管理Bean以及解析XML

    Spring是分层的轻量级框架 以IoC(Inverse of Control 反转控制)和AOP(Aspect Oriented Programming 面向切面编程)为核心 应用Spring的好处 ...

  7. Java高级特性 第14节 解析XML文档(2) - SAX 技术

    一.SAX解析XML文档 SAX的全称是Simple APIs for XML,也即XML简单应用程序接口.与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式.当使用S ...

  8. PHP创建与解析 XML 1 (36)

    一.使用SimpleXML操控XML 要处理XML 文件,有两种传统的处理思路:SAX 和DOM.SAX 基于事件触发机制,对XML 文件进行一次扫描,完成要进行的处理:DOM 则将整个XML 文件构 ...

  9. 已看1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架、多线程(并发编程)、I/O(NIO)、Socket、JDBC、XML、反射等。[泛型]\

    1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架.多线程(并发编程).I/O(NIO).Socket.JDBC.XML.反射等.[泛型]\1* ...

随机推荐

  1. Python实现telnet命令测试防火墙

    Python实现telnet命令测试防火墙 telnet主要用于测试主机端口是否开通 ping主要是用来测试网络是否畅通和主机是否正在使用 使用Python实现Telnet测试主机端口是否开通的功能. ...

  2. BigDecimal的保留位数和四舍五入的方法

    一 BigDecimal num = new BigDecimal("2.225667");//一般都会这样写最好 int count = num.scale(); System. ...

  3. 【Java面试宝典】JavaSE_2.1_Java基础● 请你说说Java和PHP的区别?

    文章目录 ①eechen的回答 - 知乎 ②h4cd-开源中国 ③乔·沃特金斯-Musings, ninja ones-思考,忍者 什么是准时制? 为什么PHP需要JIT? JIT可以使我的网站更快吗 ...

  4. wait/notify模拟线程池

    线程创建和销毁会消耗很多的资源,当我们创建线程时,会发现cpu利用率很高,为了节省资源的使用,使用线程池是一个比较好的选择,当有任务需要执行时,随机分配给一条线程去执行,也可以删除任务,获取任务数量等 ...

  5. php执行方式对比:mod_php&php-fpm

    mod_php 1.是apache的附属包,apache死掉后php也会死掉 2.稳定性差,php出错服务器进程也会受影响 php-fpm       1.和nginx是两个独立的个体. 2.php- ...

  6. leetcode-hard-array-454 4sum II-NO

    mycode   过不了...我也不知道为什么... class Solution(object): def fourSumCount(self, A, B, C, D): ""& ...

  7. 5.Hiveguigun滚(ノ`Д)ノ竟然竞争谨慎谨慎谨慎哈喇子罢工八公

    1.Hive简介 2.Hive部署与安装 3.Hive的使用 4.Hive JDBC编程

  8. 使用Statement对象执行静态sql语句

    import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java ...

  9. 手动部署 Ceph Mimic 三节点

    目录 文章目录 目录 前文列表 部署拓扑 存储设备拓扑 网络拓扑 基础系统环境 安装 ceph-deploy 半自动化部署工具 部署 MON 部署 Manager 部署 OSD 部署 MDS 部署 R ...

  10. iOS 企业版 打包

    iOS 企业版 打包 使用 iOS 企业版的证书发布应用可以跳过 Appstore,直接发布到自己的网站,让其他人在自己的网站上下载安装,但前提是要用苹果自带的Safari 浏览器才能下载安装,其他浏 ...