Tomcat解析XML和反射创建对象原理
发表于:2024-10-23 作者:千家信息网编辑
千家信息网最后更新 2024年10月23日,下面通过实例代码给大家介绍Tomcat解析XML和反射创建对象原理,具体代码如下所示:import java.lang.reflect.InvocationTargetException;import
千家信息网最后更新 2024年10月23日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.获取根节点下 的子节点 ListservletList = 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安全错误
数据库的锁怎样保障安全
sql数据删除数据库
巴州公安局网络安全保卫支队
湖南华用网络技术有限公司
我的世界服务器帮玩家改地形
服务器外网数据传输安全
服务器是否需要ups
怎么查服务器主频
东盟中国网络安全高校合作
力控软件数据库连接实列
一橙网络安全知识
泰州浪潮服务器安装
不让服务器访问公网安全
计算机和网络技术的作用
无锡附近服务器维修
金融学数据库
两台服务器光纤直连
网络安全联盟成立倡议书
东北软件开发公司有哪些
移动云信互联网科技有限公司
软件开发建站网站来电优惠中
数据库管理系统核心部分
亚马逊代理服务器
网络技术学习文案励志
申请网络安全审计服务资质认证费
软件开发的几大领域
天津机架式服务器虚拟主机
西昌市艾悦网络技术服务部
网络安全进校园宣传周
jepaas软件开发
偶数数据库的文件形式