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

下面通过实例代码给大家介绍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, 1001);
    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(0, 1).toUpperCase() //N
    + fileName.substring(1).toLowerCase(); //ame
    //根据方法名 获取公共方法
    Method method = clazz.getMethod(methodName, String.class);
    //执行指定的方法
    method.invoke(obj, "yangjian");
    System.out.println(obj);
  }

总结

以上所述是小编给大家介绍的Tomcat解析XML和反射创建对象原理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • 关于tomcat的server.xml里host节点配置的一些说明

    其实对这个一直搞不清楚,后来公司的网站遭遇与IIS进行整合,然后上面有几个应用需要进行配置,所以对tomcat的server.xml进行了一些深入的了解 Host的节点主要是起一个对域名解析到那个虚拟主机进行配置,其name属性即为访问的域名,默认是127.0.0.1,localhost以及本地Ip,当进行DNS指定之后,可以凭借域名对指定的虚拟主机进行访问. 里面的一些属性就不多讲了,看到单词基本上能明白什么意思. 然后就是context节点,这个节点主要是配置虚拟主机里的访问项目的,默认访问

  • 详述 tomcat 中的 server.xml 配置文件示例

    正文 1 前言 Tomcat 隶属于 Apache 基金会,是开源的轻量级 Web 应用服务器,使用非常广泛.server.xml是 Tomcat 中最重要的配置文件,server.xml的每一个元素都对应了 Tomcat 中的一个组件:通过对 XML 文件中元素的配置,可以实现对 Tomcat 中各个组件的控制.因此,学习server.xml文件的配置,对于了解和使用 Tomcat 至关重要. 本文将通过实例,介绍server.xml中各个组件的配置,并详细说明 Tomcat 各个核心组件的作

  • tomcat7的配置文件server.xml解析

    这里对tomcat7的server.xml文件进行解释一下,方便在分析启动源码的时候理解Digester做的事情. <?xml version='1.0' encoding='utf-8'?> <Server port="8005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.startup.VersionLoggerListener"

  • 基于tomcat配置文件server.xml详解

    1. 入门示例:虚拟主机提供web服务 该示例通过设置虚拟主机来提供web服务,因为是入门示例,所以设置极其简单,只需修改$CATALINA_HOME/conf/server.xml文件为如下内容即可.其中大部分都采用了默认设置,只是在engine容器中添加了两个Host容器. <?xml version="1.0" encoding="UTF-8"?> <Server port="8005" shutdown="SH

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

    下面通过实例代码给大家介绍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 or

  • js解析xml字符串和xml文档实现原理及代码(针对ie与火狐)

    分别针对ie和火狐分别作了对xml文档和xml字符串的解析,所有代码都注释掉了,想看哪部分功能,去掉注释就可以了. 至于在ajax环境下解析xml,其实原理是一样的,只不过放在了ajax里,还是要对返回的xml进行解析. 复制代码 代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <

  • Go反射底层原理及数据结构解析

    目录 1. 反射的引入与介绍 2. 反射的数据结构 3. 如何通过反射对象来修改原数据对象的值? 1. 反射的引入与介绍 在计算机科学中,反射是指计算机程序在运行时(Run time)可以访问.检测和修改它本身状态或行为的一种能力.用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为. 需要反射的 2 个常见场景: 有时你需要编写一个函数,但是并不知道传给你的参数类型是什么,可能是没约定好:也可能是传入的类型很多,这些类型并不能统一表示.这时反射就会用的上了. 有时候需要根据某些条

  • Tomcat Catalina为什么不new出来原理解析

    一.Catalina为什么不new出来? 掌握了Java的类加载器和双亲委派机制,现在我们就可以回答正题上来了,Tomcat的类加载器是怎么设计的? 1.Web容器的特性 Web容器有其自身的特殊性,所以在类加载器这块是不能完全使用JVM的类加载器的双亲委派机制的.在Web容器中我们应该要满足如下的特性: 隔离性: 部署在同一个Web容器上的两个Web应用程序所使用的Java类库可以实现相互隔离.设想一下,两个Web应用,一个使用了Spring3.0,另一个使用了新的的5.0,应用服务器使用一个

  • Java基础学习之反射机制原理详解

    目录 一.什么是反射 二.反射的原理 三.反射的优缺点 四.反射的用途 五.反射机制常用的类 六.反射的基本使用 一.什么是反射 (1)Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法.本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象的各种信息. (2)Java属于先编译再运行的语言,程序中对象的类型在编译期就确定下来了,而当程序在运行时可能需要动态加载某些类,这些类因为之前用不到,所以没有被加载到JVM.通过反射,可

  • Java反射机制原理、Class获取方式以及应用场景详解

    目录 学习背景 一.Java反射机制是什么? 1.1 反射原理 1.2 反射例子 二.Java反射机制中获取Class的三种方式及区别? 2.1 Class的几种获取方式 2.2 代码演示几种方式的区别 三.Java反射机制的应用场景有哪些? 3.1 应用场景 3.2 简单工厂模式优化 3.2.1 什么是简单工厂模式? 3.2.2 简单工厂模式有什么用? 3.2.3 如何实现简单工程模式? 3.2.4 简单工厂模式优化 3.2.5 简单工厂模式再次优化 3.3 代理模式中的动态代理实现 3.3.

  • JS解析XML文件和XML字符串详解

    JS解析XML文件 <script type='text/javascript'> loadXML = function(xmlFile){ var xmlDoc=null; //判断浏览器的类型 //支持IE浏览器 if(!window.DOMParser && window.ActiveXObject){ var xmlDomVersions = ['MSXML.2.DOMDocument.6.0','MSXML.2.DOMDocument.3.0','Microsoft.

  • Android应用中使用DOM方式解析XML格式数据的基本方法

    DOM比SAX更容易掌握,因为她没有涉及回调和复杂的状态管理,然而,DOM的实现常常将所有的XML节点保存在内存中,这样使的处理较大的文档效率低. XML基本的节点类型 node - DOM基本的数据类型 Element - 最主要处理的对象是Element Attr - 元素的属性 Text - 一个Element 或者Attr的实际内容 Document - 代表整个XML文档,一个Document对象通常也称为一颗DOM树   1.在src目录下新建一个android.xml <?xml

  • Java反射技术原理与用法实例分析

    本文实例讲述了Java反射技术原理与用法.分享给大家供大家参考,具体如下: 本文内容: 产生反射技术的需求 反射技术的使用 一个小示例 首发日期:2018-05-10 产生反射技术的需求: 项目完成以后,发现需要增加功能,并且希望增加功能并不需要停止项目运行. 在希望不关停项目运行的情况下,于是考虑到将功能都放到一个单独的项目之外的模块中,每一个功能实现都从这个模块中获取[实际上这个考虑应该是项目开始前就考虑,这个例子可能不是很好].于是就有了反射的产生.(这种思想有点类似工厂模式,如果学过设计

  • spring是如何解析xml配置文件中的占位符

    前言 我们在配置Spring Xml配置文件的时候,可以在文件路径字符串中加入 ${} 占位符,Spring会自动帮我们解析占位符,这么神奇的操作Spring是怎么帮我们完成的呢?这篇文章我们就来一步步揭秘. 1.示例 ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(); applicationContext.setConfigLocation("${java.versi

随机推荐