在了解自定义注解前,我们需要搞懂元注解的概念,这个在总结篇中已经说明。
这里再提一下@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());
}
然后就能看到输出了。
这个比较基础的反射知识,但是这样真的好吗?下篇文章中也有阐述。