当前位置: 移动技术网 > 网络运营>服务器>tomcat > Tomcat解析XML和反射创建对象原理

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

2019年09月09日  | 移动技术网网络运营  | 我要评论

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网