Annotation就是注解了,JDK1.5新增加功能,该功能可用于类,构造方法,成员变量,方法,参数等的声明中。
api版本23下,android studio里是直接可以使用的,不用添加依赖库,以前的api可能需要。下边介绍几种我觉得比较好用的注解。
NoNull注解
先看下源码
@Documented
@Retention(CLASS)
@Target({METHOD, PARAMETER, FIELD})
public @interface NonNull {
}
@Retention(CLASS)指@NoNull编译到类文件里
@Target({METHOD, PARAMETER, FIELD})指应用于方法,参数和成员变量
再看具体使用
其中局部变量b 设置@NonNull是报错的 因为源码指明并不能应用于局部变量
@NonNullvoid testNonNull(@NonNull String a){
@NonNull String b;
}
@NonNull String c;
CallSuper注解 首先还是先看源码
@Documented
@Retention(CLASS)
@Target({METHOD})
public @interface CallSuper {
}
标签说明: 编译时生效,应用于方法。 下边一起看下源码说明
/**
* Denotes that any overriding methods should invoke this method as well.
* * Example:
*
*@CallSuper
*public abstract void onFocusLost();
*
*/
意指所有重写方法都需要调用super.method();
ViewId注解 看了一圈发现google并没有提供替换findViewById的注解方法,这里再介绍一下如何自定义注解方法。
首先效仿源码,创建注解类
@Target(ElementType.FIELD)//表示用在成员变量
@Retention(RetentionPolicy.RUNTIME)//表示在生命周期是运行时生效
public @interface ViewInject {
int value() default -1;
//需要提供字段获取id值
}
核心逻辑就是定义注解接口,在特定时间,特定情况下执行我们预先写好的注解方法,已到达我们想要的效果。
注解执行方法
/**
* 解析注解
*/
public void autoInjectAllField() {
try {
Class> clazz = this.getClass();
Field[] fields = clazz.getDeclaredFields();
//获得Activity中声明的字段
for (Field field : fields) {
// 查看这个字段是否有我们自定义的注解类标志的
if (field.isAnnotationPresent(ViewInject.class)) {
ViewInject inject = field.getAnnotation(ViewInject.class);
int id = inject.value();
if (id > 0) {
field.setAccessible(true);
field.set(this, this.findViewById(id));
//给我们要找的字段设置值
}
}
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
}
调用此方法时,要先初始化xml文件。所以在界面Activity中,必须在setContentView()执行后,才能调用父类的注解方法autoInjectAllField()
@ViewInject(value=https://www.it610.com/article/R.id.weightSum)
Button a;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
autoInjectAllField();
a.setText("成功");
}
【android ViewId自动注解使用详解(ViewInject)】
推荐阅读
- 多渠道|Android 组件化在公用Module里实现多渠道打包配置
- Android基础|EventBus源码分析之订阅-发布模型
- Android基础|Android中Spinner下拉列表(使用ArrayAdapter和自定义Adapter实现)
- HandlerThread(子线程也可以有消息传递机制)
- Android|Android属性动画 Property animation
- JNI与底层调用-1
- #|FutureTask 使用场景介绍
- #|静态内部类创建单例的实现和优点
- #|View的三大流程是什么,加以简单说明