安卓进阶指南Annotation自定义运行时注解(三)

144 阅读1分钟

在了解自定义注解前,我们需要搞懂元注解 的概念,这个在总结篇中已经说明。

mark

代码地址:[android-annotation-tutorial](github.com/ftc300/

android-annotation-tutorial.git)

这里再提一下@Target的参数

ElementType 含义
ANNOTATION_TYPE 注解类型声明
CONSTRUCTOR 构造方法声明
FIELD 字段声明(包括枚举常量)
LOCAL_VARIABLE 局部变量声明
METHOD 方法声明
PACKAGE 包声明
PARAMETER 参数声明
TYPE 类、接口(包括注解类型)或枚举声明

我们添加如下注解定义:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface FTC300_RUNTIME {
    String value();
}

然后绑定Activity,并赋值给注解属性注解的值 。 这里我们需要了解 Class 类以及了解 java.lang.reflect.* , 不难理解,具体这边就不多介绍了

public static <T extends Activity> void bindRuntimeField(T activity){
        Field fields[] = activity.getClass().getDeclaredFields();
        for (Field field : fields) {
            if (field.isAnnotationPresent(FTC300_RUNTIME.class)) {
                FTC300_RUNTIME ftc300_runtime = field.getAnnotation(
FTC300_RUNTIME.class);
                try {
                    field.setAccessible(true);
                    field.set(activity,ftc300_runtime.value());
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
    }

最后在Activity中调用

    @FTC300_RUNTIME("ftc300_runtime")
    String ftcRuntime;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        bindRuntimeField(this);
        Log.d("MainActivity",TextUtils.concat(“FtcSource:",ftcRuntime).
toString());
    }

然后就能看到输出了。 这个比较基础的反射知识,但是这样真的好吗?下篇文章中阐述。