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和反射创建对象原理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!