乱七八糟的准备一下
学习这个之前,以前很多时候都是搜视频,博客啥的。现在我们尽量从官方文档入手,再配合一些别的进行深入学习一下。
首先想到jdk安装目录下好像有docs目录,这个貌似可以搜索Annotation这个接口…let’s find it.找了一下发现我的jdk下面并没有?其实我们可以去java官网下载文档, 这里给一个地址: https://docs.oracle.com/javase/6/docs/ 其他版本改下链接就行,相当于在线文档, 你可以下载离线版本那种。进入后
看下java.lang.annotation这个接口,可以看到很多属性定义:
我们点击这个Documented进入看下,这里有解释:
Indicates that annotations with a type are to be documented by javadoc and similar tools by default. This type should be used to annotate the declarations of types whose annotations affect the use of annotated elements by their clients. If a type declaration is annotated with Documented, its annotations become part of the public API of the annotated elements.
大概意思说:指定了这种类型的注解会默认被javadoc和类似的工具记录下来, 成为已注解元素api的一个部分。
你用javadoc编译的话,这个标记了这种类型的注解将会出现再文档中, xxxx.html. 这里面有专门的案例Java注解之Retention、Documented、Inherited介绍
特别声明,注解是jdk1.5才增加了,以前是木有的!
第一个我们算是基本认识了,后面我们就可以接着第二个第三个看….我们重点android自定义注解将会涉及到的: Target Retention
@a Target
如果直接google翻译啥的,看着很蒙。我看着都蒙。oschina上面也有在线文档,已经翻译好了,可以参考java API文档列表
简单从字面意思来看就是指示了注解的目标是什么类型,比如类,变量,函数,局部变量等,如果你指定错误了,有可能就无法通过反射获取变量,方法名称。大概先这么理解吧! 后面一步步深入。 我们看着这个ANNOTATION_TYPE:
看下面截图:
目前常用也就: ElementType.FIELD ElementType.METHOD ElementType.TYPE 基本够我们做android注解用了。一看名称也大概知道都是什么了。。。所以一开始我们就简单理解下,肯定还需要深入!
@b Retention
我们接着看下Retention:
Indicates how long annotations with the annotated type are to be retained. If no Retention annotation is present on an annotation type declaration, the retention policy defaults to RetentionPolicy.CLASS.
A Target meta-annotation has effect only if the meta-annotated type is use directly for annotation. It has no effect if the meta-annotated type is used as a member type in another annotation type.
意思是说了一个保留策略的问题,也就是有效期。如果不指定的话默认在.class之后就无效了,被丢弃了。你运行时要想获取就没办法了。所以我们看下RUNTIME
很好理解, 一个是源码阶段,一个是编译阶段,一个是运行阶段。你之前使用过butterknife或者类似注解库就知道我们的都是在onCreate进行的注解初始化,所以基本上都是运行期。所以看到这里我们就更清楚了哇…神秘的面纱越来越薄了….试着看点原始的甚至难得东西未尝不是一件好事…..
还有很多注解的属性我们后来可以一一去分析他们,多行必有好处
到这里其实有疑问,@Documented我们知道这个会把标识的注解加入到docs中。那么别的注解了。还没有深入分析原理之前,我个人简单理解是:我们如果做了这种处理,在源码阶段,编译后,运行时jvm都会为我们的这些做处理,比如你什么了runtime是source,那么你的这个注解到了编译阶段直接被抛弃,后面运行时你想通过某个手段,比如注解去获取标识了这种注解类型的注解,发现找不到。这就是java编译器给我们做的处理。So,我们就暂时这样理解吧!
下篇我们说下自定义注解吧吧吧~~~
链接记录下(后面会经常用到)
有一个链接来源也是来源转载的,获取侵权,联系我,baby!