欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

Tomcat解析XML和反射创建对象原理

程序员文章站 2022-03-18 14:49:45
下面通过实例代码给大家介绍tomcat解析xml和反射创建对象原理,具体代码如下所示: import java.lang.reflect.invocationta...

下面通过实例代码给大家介绍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, 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和反射创建对象原理,希望对大家有所帮助