Tomcat解析XML和反射创建对象原理
发表于:2025-12-05 作者:千家信息网编辑
千家信息网最后更新 2025年12月05日,下面通过实例代码给大家介绍Tomcat解析XML和反射创建对象原理,具体代码如下所示:import java.lang.reflect.InvocationTargetException;import
千家信息网最后更新 2025年12月05日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 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和反射创建对象原理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
对象
方法
反射
内容
标签
相同
类名
代码
属性
节点
原理
常用
方式
帮助
也就是
代表
使用方法
再次
出处
实例
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
军工单位网络安全风险
日本服务器代码
连云港教学视频系统服务器
服务器硬盘热插拔
互联网科技公司名称
临沂轻舟网络技术
网络安全特辑
信息网络安全调查表
百度服务器有两个ip
张江科技园 互联网企业
网络安全技术服务认证
dbeaver连接瀚高数据库
网络安全专项应急预案范文
ftp服务器如何管理用户
溧阳没有软件开发公司
数据库 触发器介绍
服务器安全防护体系
网络安全法27条处罚
客户端拼不通服务器
重庆网通服务器云服务器
数据库属性列是什么
河北oa软件开发哪家强
国产服务器机箱厂家
延庆区综合软件开发怎么样
服务器防黑
股市中网络安全龙头股
协和医院采购网络安全运维
天堂w韩服服务器
南京环保软件开发销售方法
脏小豆骗赞数服务器视频合集