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