模擬瀏覽器路徑 通過讀取XML配置檔案的方式來使用反射完成對例項物件方法呼叫
阿新 • • 發佈:2018-12-17
反射: 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(); } } }