tomcat通过Java的反射机制自动调用servlet的init、service等方法的模拟

写一个类继承Servlet,实现init、service等方法后,当tomcat收到一个http请求后,会根据web.xml获取都对应类后,便会自动调用init、service等方法。原理就是Tomcat获取到类的名称后,通过java的反射机制来自动调用servlet的init、service等方法。

下面编写一个程序来模拟Tomcat通过Java的反射机制,自动调用方法的过程

1. 首先在代码路径下添加web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>atest</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet>
  	<servlet-name>myservlet</servlet-name>
  	<servlet-class>com.test.servelet.SimServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>myservlet</servlet-name>
  	<url-pattern>/thisatest</url-pattern>
  </servlet-mapping>
</web-app>

2.  编写一个接口Iservlet,定义方法init、service


public interface Iservlet {
	public void init();
	public void service();
}

3. 编写一个类继承Iservlet

public class SimServlet implements Iservlet {

	@Override
	public void init() {
		// TODO Auto-generated method stub
		System.out.println("init");
	}

	@Override
	public void service() {
		// TODO Auto-generated method stub
		System.out.println("service");
		
	}

}

4. 编写一个类模拟tomcat自动调用servlet的init、service方法的过程

public class Test2 {
	public static void main(String[] args) {
		//1. 加载web.xml
		SAXReader reader = new SAXReader();
		Document doc = reader.read("src/web.xml");
		Element rootElement = doc.getRootElements();
		List<Element> list = rootElement.elements("servlet");
		for(Element servEle : list) {
			Element classEle = servEle.element("servlet-class");
			System.out.println(classEle.getText());
			//2. 根据类名可以创建字节码
			Class clazz = Class.forName(classEle.getText());
			Object obj = clazz.newInstance();
			
			//3. 调用方法
			Method mInit = clazz.getMethod("init");
			mInit.invoke(obj);
			
			Method mService = clazz.getMethod("service");
			mService.invoke(obj);
		}
	}
}

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值