1. 程式人生 > >利用反射呼叫註解,模仿Spring

利用反射呼叫註解,模仿Spring

簡介

在開發中,我們經常用的就是利用@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");
                }

            }
        }
    }
}