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* ...
随机推荐
- AcWing:99. 激光炸弹(前缀和)
一种新型的激光炸弹,可以摧毁一个边长为 RR 的正方形内的所有的目标. 现在地图上有 NN 个目标,用整数Xi,YiXi,Yi表示目标在地图上的位置,每个目标都有一个价值WiWi. 激光炸弹的投放是通 ...
- nginx配置服务
在nginx中的conf的文件夹里面的nginx.conf文件中 server { listen 8888; server_name localhost; location / { root C:/P ...
- [CSP-S模拟测试]:二叉搜索树(DP+贪心)
题目传送门(内部题99) 输入格式 第一行一个整数$n$,第二行$n$个整数$x_1\sim x_n$. 输出格式 一行一个整数表示答案. 样例 样例输入: 58 2 1 4 3 样例输出: 数据范围 ...
- SRS之播放推流视频
1. 综述 首先,推流直播的配置文件如下: # rtmp.conf listen 1935; max_connections 1000; daemon off; srs_log_tank consol ...
- java中线程状态
刚开始接触java时,就觉得多线程是一个障碍,不容易理解,当时选择了跳过,不过工作一段时间后,发现这块还是需要深入研究一下的,及时平时工作中不使用多线程,但一定会使用web容器,比如tomcat,也是 ...
- 一、基础篇--1.2Java集合-HashMap和HashTable的区别
HashMap和HashTable的区别 1.继承的父类不同,HashMap继承的是AbstractMap类,HashTable继承的是Dictionary类,不过都实现了Map.Clone.Seri ...
- 设置placeholder 颜色
::-webkit-input-placeholder { /* WebKit browsers */ color: rgb(100, 193, 173); } :-moz-placeholder { ...
- JQUERY的$(function(){})和window.onload=function(){}的区别
在Jquery里面,我们知道入口函数有两种写法:$(function(){}) 和$(document).ready(function(){}) 作用类似于传统JavaScript中的window.o ...
- JavaScript日常学习1
您会经常看到 document.getElementById("id"). 这个方法是 HTML DOM 中定义的. DOM (Document Object Model)(文档对 ...
- 点击其他区域关闭dialog
1.在打开dialog处阻止冒泡,在body click事件中关闭dialog2.不阻止冒泡,在body click事件中判断target是否为diallog或其子节点 在Safari浏览器中,在默认 ...