利用反射呼叫註解,模仿Spring
阿新 • • 發佈:2019-01-02
簡介
在開發中,我們經常用的就是利用@RequestMapping來呼叫我們自己的邏輯,現在我們來建立屬於自己的註解模仿一下它。
1.新建屬於自己的註解@SeayaMapping
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SeayaMapping {
String value();
}
2.建立類使用@SeayaMapping標註
@SeayaMapping("/say") public class SeayaTest { @SeayaMapping("/hello") public void sayHello(String s){ System.out.println(s); } }
3.建立好之後,假如現在客戶端訪問http://localhost:8080/say/hello, 當我們已經在服務端獲取到這個請求時,就需要呼叫這個方法。
首先我們得拿到包下所有的類,主要是通過啟動類獲取包名,在通過包名獲取所有類。通過包名獲取所有類.
接下來就是遍歷每一個類,如果這個類有@SeayaMapping註解,那個再獲取這個類的所有方法,然後遍歷所有方法,如果方法有@SeayaMapping註解,利用invoke()方法來執行。
寫出來就變成這樣了,好可怕的程式碼。。。
for ( Class<?> aClass: classes) { for ( Annotation classA: aClass.getAnnotations()) { if (classA instanceof SeayaMapping && ((SeayaMapping) classA).value().equals("/say")){ for (Method m : aClass.getMethods()) { for (Annotation a : m.getAnnotations()) { if (a instanceof SeayaMapping && ((SeayaMapping) a).value().equals("/hello")) m.invoke(aClass.newInstance(),"Ok beng"); } } } } }