Tomcat解析XML和反射创建对象原理
下面通过实例代码给大家介绍Tomcat解析XML和反射创建对象原理,具体代码如下所示:
importjava.lang.reflect.InvocationTargetException; importjava.lang.reflect.Method; importjava.util.List; importorg.dom4j.Document; importorg.dom4j.DocumentException; importorg.dom4j.Element; importorg.dom4j.io.SAXReader; publicclassServerReadXML1{ publicstaticvoidmain(String[]args) throwsDocumentException,ClassNotFoundException,InstantiationException,IllegalAccessException, NoSuchMethodException,SecurityException,IllegalArgumentException,InvocationTargetException{ //现在假如在浏览器中输入一个Servlet的url-pattern StringurlPattern="/first"; //根据urlPattern获取类名 StringclassName=getClassByUrl(urlPattern); //根据全类名获取Class对象 Classclazz=Class.forName(className); //通过反射clazz对象创建指定对象 Objectobj=clazz.newInstance(); //获取service方法 Methodmethod=clazz.getDeclaredMethod("service"); //获取权限 method.setAccessible(true); //执行service方法 method.invoke(obj); } privatestaticStringgetClassByUrl(StringurlPattern)throwsDocumentException{ //1.创建SAXReader对象 SAXReaderreader=newSAXReader(); //2.读取文件 Documentdocument=reader.read(ServerReadXML1.class.getClassLoader().getResourceAsStream("web.xml")); //3.获取根节点 ElementrootElement=document.getRootElement(); //System.out.println(rootElement.getName()); //4.获取根节点下的子节点 ListservletList=rootElement.elements(); //记录与urlPattern相同的servlet-name标签的内容 StringservletName=""; //记录servlet标签中的servlet-class的内容 //servletClassName的内容也就是Servlet的全类名 StringservletClassName=""; //5.遍历子节点 for(ElementservletElement:servletList){ //System.out.println(servletElement.getName()); //判断如果是servlet-mapping标签时,执行代码 if("servlet-mapping".equals(servletElement.getName())){ //获取url-pattern标签对象 Elementurl=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(ElementservletElement: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 returnservletClassName; } }
1.反射的获取Class4种方式
@Test publicvoidtest1()throwsClassNotFoundException{ //1.类名.class Classclazz=String.class; System.out.println(clazz); //2.对象.getClass() Classclazz1="abc".getClass(); System.out.println(clazz1); //3.Class.forName(); Classclazz2=Class.forName("java.lang.String"); System.out.println(clazz2); //4.ClassLoader.loadClass("全类名") Classclazz3=ReflectTest1.class.getClassLoader().loadClass("java.lang.String"); System.out.println(clazz3); }
2.反射使用属性的常用方法
@Test publicvoidtest2()throwsClassNotFoundException,NoSuchFieldException,SecurityException,IllegalArgumentException,IllegalAccessException{ //获取Class对象可以获取其内部的属性 Classclazz=Class.forName("com.atguigu.bean.User"); Useruser=newUser(); //Field对象代表中类的属性getField只能获取公共属性 Fieldfield=clazz.getField("email"); System.out.println(field); //此种方式破坏代码的封装性不推荐使用 Fieldfield2=clazz.getDeclaredField("id"); System.out.println(field2); field2.setAccessible(true); field2.setInt(user,1001); System.out.println(user); }
3.反射使用方法的常用方法
@Test publicvoidtest3()throwsClassNotFoundException,InstantiationException,IllegalAccessException,NoSuchMethodException,SecurityException,IllegalArgumentException,InvocationTargetException{ Classclazz=Class.forName("com.atguigu.bean.User"); //通过反射创建对象 Objectobj=clazz.newInstance(); //现在想要设置name值 StringfileName="name"; //创建一个方法名 StringmethodName="set"+fileName.substring(0,1).toUpperCase()//N +fileName.substring(1).toLowerCase();//ame //根据方法名获取公共方法 Methodmethod=clazz.getMethod(methodName,String.class); //执行指定的方法 method.invoke(obj,"yangjian"); System.out.println(obj); }
总结
以上所述是小编给大家介绍的Tomcat解析XML和反射创建对象原理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!