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, );
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和反射创建对象原理的更多相关文章
- Qt中三种解析xml的方式
在下面的随笔中,我会根据xml的结构,给出Qt中解析这个xml的三种方式的代码.虽然,这个代码时通过调用Qt的函数实现的,但是,很多开源的C++解析xml的库,甚至很多其他语言解析xml的库,都和下面 ...
- Digester解析xml原理
Tomcat内部是使用Digester来解析xml文件的,将xml转化为java对象. digester底层是基于SAX+事件驱动+栈的方式来搭建实现的,SAX主要用来解析xml,事件驱动主要是在解析 ...
- 在tomcat启动时解析xml文件,获取特定标签的属性值,并将属性值设置到静态变量里
这里以解析hibernate.cfg.xml数据库配置信息为例,运用dom4j的解析方式来解析xml文件. 1.在javaWeb工程里新建一个java类,命名为GetXmlValue.java,为xm ...
- Java反射——读取XML文件,创建对象
读取XML文件,创建对象 config.xml <?xml version="1.0" encoding="UTF-8"?> <beans&g ...
- .NET解析xml字符串,通过反射给实体类对象赋值,获取实体类数据列表
/// <summary> /// 解析xml字符串 转换为实体类列表数据 /// </summary> /// <param name="xmlStr&quo ...
- Spring中管理Bean以及解析XML
Spring是分层的轻量级框架 以IoC(Inverse of Control 反转控制)和AOP(Aspect Oriented Programming 面向切面编程)为核心 应用Spring的好处 ...
- Java高级特性 第14节 解析XML文档(2) - SAX 技术
一.SAX解析XML文档 SAX的全称是Simple APIs for XML,也即XML简单应用程序接口.与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式.当使用S ...
- PHP创建与解析 XML 1 (36)
一.使用SimpleXML操控XML 要处理XML 文件,有两种传统的处理思路:SAX 和DOM.SAX 基于事件触发机制,对XML 文件进行一次扫描,完成要进行的处理:DOM 则将整个XML 文件构 ...
- 已看1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架、多线程(并发编程)、I/O(NIO)、Socket、JDBC、XML、反射等。[泛型]\
1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架.多线程(并发编程).I/O(NIO).Socket.JDBC.XML.反射等.[泛型]\1* ...
随机推荐
- 洛谷 P1800 software_NOI导刊2010提高(06)(二分答案+DP检验)
P1800 software_NOI导刊2010提高(06) 标签 二分答案 难度 普及/提高- 题目描述 一个软件开发公司同时要开发两个软件,并且要同时交付给用户,现在公司为了尽快完成这一任务,将每 ...
- Killer Problem (UVA 11898 )
Problem You are given an array of N integers and Q queries. Each query is a closed interval [l, r]. ...
- 2019 7.6 T2 虫洞
虫洞(conch) [题目描述] HZY 现在在数轴原点处,她想跑到 2000001 这个点上.听说各路 神犇暑假里都在健♂身,所有 HZY 也想不要只是简单地跑步,于是她 决定在这条数轴上造虫洞,具 ...
- cmd中实现代码雨的命令。。。
颜色修改时不能使用十六进制数 @echo off title digitalrain color 0b setlocal ENABLEDELAYEDEXPANSION for /l %%i in (0 ...
- Android蓝牙通信
Android为蓝牙设备之间的通信封装好了一些调用接口,使得实现Android的蓝牙通信功能并不困难.可通过UUID使两个设备直接建立连接. 具体步骤: 1. 获取BluetoothAdapter实例 ...
- AcWing:142. 前缀统计(字典树)
给定N个字符串S1,S2…SNS1,S2…SN,接下来进行M次询问,每次询问给定一个字符串T,求S1S1-SNSN中有多少个字符串是T的前缀. 输入字符串的总长度不超过106106,仅包含小写字母. ...
- JIRA备份,数据迁移以及小问题
Jira的备份(切记将许可证号备份) Jira默认会打开自动备份的功能,备份路径为/var/atlassian/application-data/jira/export 管理员账号登录Jira,点击右 ...
- JVM 监控工具——jstatd
1. 简介 jstatd是一个rmi的server应用,用于监控jvm的创建和结束,并且提供接口让监控工具(如visualvm)可以远程连接到本机的jvms . 注意是jvms,就是说运行jstatd ...
- CSS标签详解
CSS3标签 Css3概述 从2010年开始,HTML5与CSS3就一直是互联网技术中最受关注的两个话题.从前端技术的角度可以把互联网的发展分为三个阶段:第一阶段是web1.0以内容为主的网络,前端主 ...
- synchronized三种使用方式,及锁的类型验证
Synchronized常用三种使用方式 1.修饰普通方法:锁对象即为当前对象 2.修饰静态方法:锁对象为当前Class对象 3.修饰代码块:锁对象为synchronized紧接着的小括号内的对象 一 ...