java利用反射實現與@Onclick(R.id.button)類似的功能示例

java利用反射實現與@Onclick(R.id.button)類似的功能示例

import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;

@Target({ElementType.METHOD}) //用來標註該註解使用的範圍如類,方法等
@Retention(RetentionPolicy.RUNTIME) //指定一條註解應該保留多長時間,源碼級別,編譯級別,運行時級別
@Inherited //表示該註解可被子類繼承(一定是類,枚舉和接口無效)
@interface MyAnnotation {
    String value() default "";//當只有一個元素時,元素名必須爲value
}

class AnnotationAchieve {
    public static void process(final Object object) throws Exception {
        Class clazz = object.getClass();
        Method[] methods = clazz.getDeclaredMethods();

        for (final Method method : methods) {
        	MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);//通過反射api獲取方法上面的註解,如果沒有這樣的註釋就會返回null。
            if (myAnnotation != null) {//不可去掉
                method.invoke(object, myAnnotation.value());//通過反射來調用被註解修飾的方法
            }
        }
    }
}

public class Test4 {
    @MyAnnotation("你好")//使用註解
    public void print(String value){
        System.out.println("註解起作用啦,value = "+value);
    }
    public static void main(String[] args) throws Exception {
        AnnotationAchieve.process(new Test4());//調用註解處理器
    }
}

 運行結果:

註解起作用啦,value = 你好

 總結:這樣的註釋功能類似於間接調用函數,將複雜的過程屏蔽掉,然後繞了一圈調用函數,不知道那些框架是不是有做過優化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章