一、注解
1、元注解
简单描述:是由Java提供的基础注解,负责注解其它注解
2、元注解有
@Target -----------> 注解对象的范围
@Retention --------> 注解保留的生命周期
@Inherited ---------> 标明所修饰的注解在所作用的类上,是否可以被继承
@Documented ----> javadoc的工具文档化,一般不关心
3、常用注解解释
二、自定义注解
1、自定义注解规则:
其中:@Target 和 @Retention 这两个就是上面讲的元注解,(上面定义也说了,负责注解其他注解。),value 就是在你使用自定义注解的时候需要填写的内容 如:@BindView( 这里就是需要填写的int 类型的值 )
使用:
kotlin 自定义注解如下:
kotlin 自定义注解的使用,同上java的注解一样。
三、自定义注解的应用 (APT 技术)
上面自定义注解大家应该都知道如何去创建和使用了,但是使用之后如何去处理和解析自定义注解才是关键。下面讲通过一个案例讲解如何去使用并解析,注解能做到哪些事情。
项目主要的内容和背景:模仿ButterKnife,通过注解去实现findviewById 的操作。
项目前期准备工作,三步走:
1、创建model ,这里主要创建两个model,一个是专门放注解的 annotations ,一个是用来解析注解的annotation_compiler
2、在annotation_compiler 中添加AutoService的注解,为了帮助我们对注解进行处理:
3、添加相互的依赖
首先:annotation_compiler 项目是对annotation中注解的内容进行解析,所以,annotation_compiler中需要添加对annotation的依赖,所以需要在annotation_compiler项目gradle中添加:
同时项目中需要使用到注解,因为我们写的这个注解也是为了提供给项目(app),进行使用的,所以项目中我们要添加对annotation_compiler和annotation 的依赖。所以这里在app中的gradle中添加如下代码:
正式的项目开始:
首先我们需要了解到,注解的解析发生在 java---->javac 编译过程中去实现的,而后面我们要讲到的插桩技术是发上在 javac---->dex 之间的。所以注解实际上是对注解所标记的内容进行处理,并生成对应的 .java 文件。
下面开始进入正题:
在annotation 中编写注解
在annotation_compiler 编写对应的解析类,并生成处理被标记的属性的方法。
思路:因为我们想要做的是findviewById, 所以我们首先要确定我们的注解注解了哪些view,同时需要生成一个文件,而这个文件做的事情就是 对所有被标记的view,进行findViewById.
在annotation_compiler 中创建一个类,这里就叫:AnnotationCompiler 继承自 AbstractProcessor
初始化等会生成文件需要用到的类,同时实现两个父类的方法,如下
注意:当java在编译的时候,会自动执行 process 中的方法,并将被注解的元素和方法,回传到这里,所以后面我们就是在这个父类的方法下面对应的去解析被标注的view.
这里要注意一定要记得关流,一定要记得关流,一定要记得关流
这里来看下我们生成的文件是什么样子的:
在app中,我们对应的编写一个类,一个是接口,接口是为了绑定讲对应的view 传递到生成的类中去的,上面也看到了,我们生成的类实现了一个接口叫:IBinder, 为什么要这样,因为你会看到其实findviewById,前面是有一个view的,真正的findViewById 应该是 view.findViewById.
编写一个用来绑定的帮助类如下
在activity 中如何去使用:
总结:在不知道我们要生成什么文件的时候,我们可以先用java实现我们的功能,再讲这些重复的功能通过注解去生成文件在进行统一处理,这样就可以知道我们在生成文件的时候,如何去对应的去写每一行代码了。
注意:
1、把工程的gradle-wrapper和gradle-plugin分别降低到4.10.1,3.2.0原因:gradle - 3.3 - 3.4 中 javaCompileTask 没有处理 Annotation Processer
2、有些无法生成对应的文件,这里需要我们创建如下文件夹以及文件,切记要一模一样。
文件夹:resources\META-INF\services
文件:javax.annotation.processing.Processor
内容:为你编写的AnnotationCompiler全路径,这里我的文件全路径为:com.example.annotation_compiler.AnnotationCompiler