1. 程式人生 > >反射與註解

反射與註解

註解其實是對類、方法、屬性這些位元組碼的進一步修飾
通過註解,可以輕鬆地對這些位元組碼作進一步擴充套件,而不需要修改原有的內容

而反射可以獲取到這些註解,那麼就可以對執行時的例項物件做進一步處理
註解和反射形成配合,將位元組碼的一部分共性抽離出來,通用地處理

其實@Table,@Column這些JPA註解,也是通過註解和反射的配合來完成的

下面用一個簡單的例子來描述註解和反射的配合:

先自定義一個註解MyAnnotation,註解裡的text()用來儲存一段文字資訊

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

//在執行時註解依然存活
@Retention(value = RetentionPolicy.RUNTIME) public @interface MyAnnotation { public String text(); }

算數類Calculation本身作用是求兩個數之和 ,現在使用自定義的註解對它作修飾,目的是在求和之後列印多一句話。

public class Calculation {

    @MyAnnotation(text = "The result is")
    public int add(int a, int b){
        return a + b;
    }

}

最後寫一個測試類

import java.lang.reflect.Method;

public class AnnotationTest {

    public static void main(String[] args) throws Exception {
        //  傳入位元組碼
        test(Calculation.class);
    }

    public static void test(Class<?> clazz) {
        try {
            // 根據引數,獲取位元組碼裡面的對應方法
            Method method = clazz.getMethod("add"
, new Class[] { int.class, int.class }); // 通過位元組碼反射建立例項物件 Object object = clazz.newInstance(); // 獲取方法上的MyAnnotation註解 if (method.isAnnotationPresent(MyAnnotation.class)) { MyAnnotation ma = method.getAnnotation(MyAnnotation.class); // 獲取註解的內容 String text = ma.text(); // 反射呼叫例項物件的方法 Object result = method.invoke(object, new Object[] { 10, 1 }); System.out.println(text + " " + result); } } catch (Exception e) { } } }

輸出結果:The result is 11