-
什么是注解?
-
如何自定义注解?
-
怎么对自定义注解标注的元素(属性,方法等)进行解析?
一、什么是注解?
个人理解就是对程序的解释,并且具有一定的功能,相比注释只是说明性文字。例如:常见的@ResId、@Nullable 起到编译时规范代码的作用,第三方有名的框架:ButterKnife、ARouter、Retrofit等等都使用了大量的注解,除此之外注解还能让代码更简洁,可读性更强。
二、如何自定义注解 ?
我们以实现ButterKnife的绑定控件为例子讲解:
1、工程目录新建三个依赖
- lib-annotation(Java依赖):存放自定义注解
- lib-processor (Java依赖 ):存放注解处理器
- bind-core (Android依赖):供外部调用
2、自定义注解
@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.FIELD)
public @interface BindView {
int value();
String describe() default "";//多个参数示例,default 指定默认值
}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface OnClick {
int[] value();//传递View的id,
}
- @Retention:指定注解作用时期,包括SOURCE、CLASS、RUNTIME。RUNTIME的作用时期最长
- @Target:指明该注解作用的代码元素,例如属性、方法、类、接口等
- value() :默认的字段,给注解携带参数,另外你也可以自定义字段
三、自定义注解处理器(lib-annotation包下),对注解进行解析
1、 lib-annotation的gradle内容容
plugins {
id 'java-library'
}
java {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation project(':lib-annotation')
//用于自动为 JAVA Processor 生成 META-INF 信息。
implementation 'com.google.auto.service:auto-service:1.0-rc6'
annotationProcessor 'com.google.auto.service:auto-service:1.0-rc6'
//快速生成.java文件的库
implementation 'com.squareup:javapoet:1.13.0'
}
2、创建BindingProcessor 继承自AbstractProcessor,重写主要的三个方法
-
getSupportedSourceVersion():设置版本
-
getSupportedAnnotationTypes():设置支持的注解
set集合
-
process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv):主要的注解元素解析方法

本文介绍了注解的概念,以及如何自定义注解和注解处理器。通过实例展示了如何利用注解处理器在编译时生成代码,简化ButterKnife类似的视图绑定和点击事件处理。此外,还探讨了注解在提高代码可读性和减少反射性能影响上的优势,并提供了完整的代码示例和项目结构。

1048

被折叠的 条评论
为什么被折叠?



