1. 程式人生 > >模擬瀏覽器路徑 通過讀取XML配置檔案的方式來使用反射完成對例項物件方法呼叫

模擬瀏覽器路徑 通過讀取XML配置檔案的方式來使用反射完成對例項物件方法呼叫

反射: JAVA反射機制是在執行狀態中,對於任意一個實體類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意方法和屬性;這種動態獲取資訊以及動態呼叫物件方法的功能稱為java語言的反射機制。

 

 API:

XML例子: 

	<servlet>
		<servlet-name>Servlet1</servlet-name>
		<servlet-class>XmlTest.MyTest</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>Servlet1</servlet-name>
		<url-pattern>/typ1</url-pattern>
	</servlet-mapping>
	
	<servlet>
		<servlet-name>Servlet2</servlet-name>
		<servlet-class>XmlTest.MyTest1</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>Servlet2</servlet-name>
		<url-pattern>/typ2</url-pattern>
	</servlet-mapping>

 

介面:

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

兩個實現類 :

package XmlTest;

public class MyTest implements Servlet1 {

	@Override
	public void init() {
		System.out.println("init11111");

	}

	@Override
	public void service() {
		System.out.println("service11111");

	}


}
package XmlTest;

public class MyTest1 implements Servlet1 {

	@Override
	public void init() {
		System.out.println("init22222");

	}

	@Override
	public void service() {
		System.out.println("service22222");

	}

}

 Test類:  執行@Test

package XmlTest;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Before;
import org.junit.Test;

public class TestServlet {
	private HashMap<String,String> data = new HashMap<>();
	

	@Before
	public void t1() {
		try {
			//1.建立解析器物件
			SAXReader saxReader = new SAXReader();
			//2.使用解析器載入web.xml檔案得到document物件
			Document document = saxReader.read("src/XmlTest/web.xml");
			//3.獲取根元素節點
			Element element = document.getRootElement();
			//4.獲取子節點
			List<Element> elements = element.elements();
			//5.遍歷得到的元素
			for (Element element2 : elements) {
				//6.判斷元素的名稱為servlet的元素節點
				if("servlet".equals(element2.getName())) {
					//7.分別獲取servlet元素節點的servlet-name和servlet-class的值
					String servletname = element2.element("servlet-name").getText();
					String servletClass = element2.element("servlet-class").getText();
					data.put(servletname, servletClass);
				}
				if("servlet-mapping".equals(element2.getName())) {
					//8.通過servlet key 得到值
					String servletName = element2.element("servlet-name").getText();
					String urlPattern = element2.element("url-pattern").getText();
					String servletClass = data.get(servletName);
					//9.以urlPattern為key 以servletClass為值  放進map裡面
					data.put(urlPattern, servletClass);
					//10.移除servletName為key的
					data.remove(servletName);
				}
			}
			//看一下
			System.out.println(data);
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	@Test
	public void testUrl() {
		try {
			//模擬在瀏覽器輸入一個url
			String myUrl = "/typ2";
			//通過url得到類全名
			String servletClass = data.get(myUrl);
			//通過servletClass獲取位元組碼檔案
			Class clazz = Class.forName(servletClass);
			//通過位元組碼檔案建立例項物件
			Object obj = clazz.newInstance();
			//通過位元組碼檔案獲取方法
			Method method = clazz.getMethod("service", null);
			//執行方法
			method.invoke(obj, null);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}