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* ...
随机推荐
- Dungeon Master (POJ - 2251)(BFS)
转载请注明出处: 作者:Mercury_Lc 地址:https://blog.csdn.net/Mercury_Lc/article/details/82693907 题目链接 题解:三维的bfs,一 ...
- SpringMVC——返回值类型
1.void作为返回值类型 如果你的方法写成了Void就跟原来Servlet含义是差不多的 @RequestMapping("/index*") public void first ...
- centos 链接错误解决方法
执行除cd sln以外任何指令都报错,解决方法:sln /usr/lib64/ld-2.17.so /usr/lib64/ld-linux-x86-64.so.2 LD_PRELOAD=/lib64/ ...
- How to correctly set application badge value in iOS 8?
o modify the badge under ios8 you have to ask for permissions let settings = UIUserNotificationSetti ...
- Linux 多线程按照线程顺序打印字符
#include <stdio.h> #include <pthread.h> #include <unistd.h> ; pthread_mutex_t mute ...
- Python轻量级开发工具Genay使用
Genay是一个轻量级的免费,开放源代码的开发工具,支持很多的文件类型,并且支持很多的插件,启动快速.安装包只有十几兆,相关的插件也不大,相比pycharm专业版需要收费,并且社区版的安装包大小有两百 ...
- ElementTree 无法处理中文
ElementTree.fromstring() 导入xml格式时,是可以选择解析parser的编码的,并且 它解析出来的node类型是 严谨且严格的,不会 自己内部全部转换成str,比如 9.87 ...
- python格式化字符串format的用法
填充与对齐 填充常跟对齐一起使用 ^.<.>分别是居中.左对齐.右对齐,后面带宽度 :号后面带填充的字符,只能是一个字符,不指定的话默认是用空格填充 比如 In [15]: '{:> ...
- maven 打jar包和war包
( 最简单的:修改pom.xml文件: <packaging>war</packaging>(如果是jar,则是&l ...
- Web jsp开发学习——dbcp jsp连接MySQL出现中文乱码解决
开发过程中,通过dbcp.properties连接MySQL数据库,向数据库中插入中文字符时,出现乱码情况. 通过查阅资料,发现出现乱码的原因:MySQL数据库使用的是UTF-8编码,而dbcp.pr ...