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

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

安卓进阶指南Annotation自定义运行时注解(三)_第1张图片
0FgBFBce9h.png

这里再提一下@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  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());
    }

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

你可能感兴趣的:(安卓进阶指南Annotation自定义运行时注解(三))