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* ...
随机推荐
- docker命令集锦
sudo docker image ls 查看有哪些image镜像sudo docker run hello 运行image 删除全部containerdocker rm $(docker conta ...
- vue中单选框与多选框的实现与美化
我们在做一些页面时,可能会用到很多的单选框和复选框,但是原生的radio和checkbox前面的原型图标或方框样式不尽人意.于是,决定自己来实现单选框和复选框.我用的是vue,所以就用vue的方式实现 ...
- JavaWeb-SpringBoot(抖音)_三、抖音项目后续
JavaWeb-SpringBoot(抖音)_一.抖音项目制作 传送门 JavaWeb-SpringBoot(抖音)_二.服务器间通讯 传送门 JavaWeb-SpringBoot(抖音)_三.抖音项 ...
- truncate at 255 characters with xlsx files(OLEDB方式读取Excel丢失数据、字符串截断的原因和解决方法)
The TypeGuessRows setting is supported by ACE. Note the version numbers in the key may change depend ...
- TCP路径MTU发现
路径MTU 当在同一个网络上的两台主机互相通信时,该网络的MTU是非常重要的.当时如果两台主机之间的通信要通过多个网络,那么每个网络的链路层就可能有不同的MTU.重要的不是两台主机所在网络的MTU,而 ...
- vscode+python+flake8+cmder配置
{ "window.zoomLevel": 0, "[python]": {}, "kite.showWelcomeNotif ...
- Oracle 性能之 Enq: CF - contention
Oracle 性能之 Enq: CF - contention Table of Contents 1. 原因 2. 解决问题 2.1. 针对持有锁进程类型处理 2.1.1. 查看持有锁会话的进程类型 ...
- [微信小程序] 当动画(animation)遇上延时执行函数(setTimeout)出现的问题
小程序中当动画animation遇上setTimeout函数内部使用this.setData函数,通常情况下会出现报错.本文先告诉解决方法,后分析报错原因 1.解决方法: 在 setTimeout() ...
- 搭建Java服务器,并且实现远程安全访问linux系统
1.通过ssh实现安全远程访问linux系统 ssh :secure shell 加密: 1. 对称加密 (加密密钥与解密密钥相同) des ...
- c# 动态编译CodeDomProvider.CompileAssemblyFromSource(CompilerParameters cp,string code)
1.使用c#动态编译,可参考如下: //生成c#代码 string code = GenerateCode(); CodeDomProvider cdp = CodeDomProvider.Creat ...