今日无事,应狒狒之邀,写一篇详细的关于注解的文章。
注解的优点:方便,简洁,配置信息和 Java 代码放在一起,有助于增强程序的内聚性。
注解的缺点:分散到各个 class 文件中,所以很不方便维护,比如一些路由注解,打在 activity 上,尤其是支持多路径的时候,找个错能让你疯。
总体来说注解对于编码带来的好处要多于坏处的,尤其是在是恰当的使用的时候,完全可以减少或者避免他所带来的缺点的。
了解了上面这些之后我们就来看看怎么用好注解这个利器吧。
内容可能比较多,视情况分篇写。免得您看的头疼眼花从了解到放弃。
Android 大部分用的 Java,我们只谈 Java 注解和怎么自定义适合自己的注解
Java 语言提供几种基本的元注解,了解并掌握它们之后我们才可以做到得心应手的自定义自己需要的注解。
Java5.0 定义了 4 个标准的 meta-annotation 类型,它们被用来提供对其它 annotation 类型作说明。
@Target 指定了注解对象使用范围,也就是限制了被 @Target 修饰的注解的可以放在什么地方上面,可以修饰:packages、types(类、接口、枚举、Annotation 类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch 参数)
@Target 取值 (ElementType) 有:
比如我们见到最多的系统方法注解 @Override
- @Target(ElementType.METHOD)@Retention(RetentionPolicy.SOURCE)public@interface Override{}
就通过 @Target 指定了该注解只作用于 method,也就是类方法。
@Retention 指定了注解对象作用的生命周期,比如有些注解是在编码阶段进行合法化检查的,只需要在源码里保留就行。无需编译进 dex 文件中。再比如有些注解是需要运行时通过反射获取的,就需要一直保留着。
@Retention 取值(RetentionPoicy)有:
我们上面的 @Override 例子里的 @Retention(RetentionPolicy.SOURCE) 就是表示 @Retention(RetentionPolicy.SOURCE) 注解只在源码阶段有效。
@Documented 是一个标记注解,它代表着此注解会被 javadoc 等文档生成工具提取到文档内。在 doc 文档中的内容会因为此注解的信息内容不同而不同。@Documented 没有属性成员。
@Inherited 也是一个标记注解,它声明了某个被标注的类型是被继承的。如果一个使用了 @Inherited 修饰的注解类型被作用于一个 class,则这个注解将被作用于该 class 的所有子类。
需要注意的是 @Inherited 注解只会被标注过的 class 的子类所继承。类并不会从它所实现的接口继承该注解,方法也不会从它所重载的方法继承该注解。
而且当 @Inherited 标注的注解的 Retention 属性值是 RetentionPolicy.RUNTIME 时,反射 API 会增强这种继承性。也就是说当我们使用 java.lang.reflect 去查询一个标注了被 @Inherited 修饰的注解所标注时,反射代码会去检查类和其父类,直到指定的注解类型被发现,或者到达类继承结构的顶层。
以上就是 Java 提供的元注解的介绍了,接下来我们看自定义注解
@interface 用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、类、String、enum)。可以通过 default 来声明参数的默认值。 使用 @interface 自定义注解时,会自动继承 java.lang.annotation.Annotation 接口,编译程序会自动完成其他细节。 定义注解时,不能继承其他的注解或接口。
自定义注解格式为
- public@interface注解名 {定义体
- }
注解的参数只支持以下数据类型
需要注意的点
例:
- @Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documented
- public@interface BindView{
- intvalue()default-1;
- }
以上就是自定义注解的要点了。
下一篇:Android 提供的常用注解以及自定义限制作用注解 下下一篇:怎么定义以及代码解析运行时注解
有什么建议的可以留言喔
如果我的博客对您有帮助,请留言鼓励下或者点个赞吧!
我建了一个 QQ 群(群号:121606151),用于大家讨论交流 Android 技术问题,有兴趣的可以加下,大家一起进步。
来源: http://blog.csdn.net/gengqiquan/article/details/70184450