深入浅出Java注解
注解的作用
- 格式检查:告诉编译器信息,比如被@Override标记的方法如果不是父类的某个方法,IDE会报错;
- 减少配置:运行时动态处理,得到注解信息,实现代替配置文件的功能;
- 减少重复工作:比如第三方框架xUtils,通过注解@ViewInject减少对findViewById的调用,类似的还有(JUnit、ActiveAndroid等);
使用场合:
- 动态配置信息;
- 代为实现程序逻辑(比如xUtils中的@ViewInject代为实现findViewById);
- 代码格式检查,比如Override、Deprecated、NonNull、StringRes等,便于IDE能够检查出代码错误;
优点:
- 在class文件中,提高程序的内聚性;
- 减少重复工作,提高开发效率,比如findViewById。
缺点:
- 如果对annotation进行修改,需要重新编译整个工程;
- 业务类之间的关系不如XML配置那样一目了然;
- 程序中过多的annotation,对于代码的简洁度有一定影响;
- 扩展性较差;
Nullness注解
资源类型注解
类型定义注解
线程注解
值约束注解
权限注解
复写方法注解
元注解
- @Target:
作用:用于描述注解的使用范围,即被描述的注解可以用在什么地方;
作用:用于描述注解的使用范围,即被描述的注解可以用在什么地方;
取值:
1、CONSTRUCTOR:构造器;
2、FIELD:实例;
3、LOCAL_VARIABLE:局部变量;
4、METHOD:方法;
5、PACKAGE:包;
6、PARAMETER:参数;
7、TYPE:类、接口(包括注解类型) 或enum声明。
- @Retention:
作用:表示需要在什么级别保存该注解信息,用于描述注解的生命周期,即被描述的注解在什么范围内有效;
取值:
1、SOURCE:在源文件中有效,即源文件保留;
2、CLASS:在class文件中有效,即class保留;
3、RUNTIME:在运行时有效,即运行时保留;
- @Documented:
作用:用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。
- @Inherited:
作用:用于描述某个被标注的类型是可被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。
如何自定义注解
1、注解类中的方法只能用public或者默认这两个访问权修饰,不写public就是默认
2、如果注解类中只有一个成员,最好把方法名设置为"value"
3、注解元素必须有确定的值,要么在定义注解的默认值中指定,要么在使用注解时指定,非基本类型的注解元素的值不可为null。因此, 使用空字符串或0作为默认值是一种常用的做法。