Android 自定义注解步骤

335 阅读2分钟

一、注解与注解处理器 1、编译时技术

程序运行分为 :源码期 编译器期 运行期

         源码  编译文件  dex  

注解就是在编译器期-->通过注解和注解处理器去执行通用的业务,达到提升开发效率的效果

二、新建Android工程

三、新建Java module ,示例:取名lib 必须是javalibriry是因为,注解处理器模块需要引用java库,而Android library不能依赖java库,所以只能新建java library 。

一般新建两个库: 注解模块 注解处理器模块

1、在build.gradle下配置依赖 :

api com.google.auto.service:auto-service:1.0-rc7

image.png

2、在工程下新建注解类 :BindViewId

@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.FIELD)
public @interface BindViewId {
    int value() default -1;
}

@Tareget 声明注解的作用域,注解标记用在什么地方 @Retention 声明这个注解的生命周期,存在周期:源码期 编译期 运行期

int value():注解接收的参数

四、在app module下 1、在build.gradle中配置对注解module lib的引用 :

implementation project(":lib")
annotationProcessor project(":lib")

annotationProcessor 修饰的库是注解处理器,可以在编译时去执行对应逻辑代码

image.png

2、编写测试代码

@BindViewId(R.id.main_tv)
public TextView mainTv;

被注解的属性或方法不能定义成private或static

image.png

image.png

五、处理注解 在lib module下新建BindViewProcesspr,继承自AbstractProcessor,添加类注解 @AutoService(Processor.class),并实现如下四个方法

@Override
public synchronized void init(ProcessingEnvironment processingEnv) {
    super.init(processingEnv);
    mFiler = processingEnv.getFiler();
    mElements = processingEnv.getElementUtils();
    mMessager = processingEnv.getMessager();

}

/**
 * 处理的注解类型
 *
 * @return
 */
@Override
public Set<String> getSupportedAnnotationTypes() {
    Set<String> annotations = new LinkedHashSet<>();
    annotations.add(BindViewId.class.getCanonicalName());
    return annotations;
}

@Override
public SourceVersion getSupportedSourceVersion() {
    return SourceVersion.latestSupported();
}

@Override
public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
     
     ... 

}

java结构化 TypeElement 类结点 ExecutableElement 方法结点 VariableElement 成员变量结点 PackageElement 包结点

总结 : 注解处理器: 1、注册:依赖auto-service 2、继承AbstractProcessor 3、AutoService(Proccor.class) 4、声明支持的java版本 ,注解处理器处理的注解有哪些 注解方式 :supportVersion supportType 包名+类名 5、Process方法 注解处理器器的核心方法

六、编译项目 查看编译日志和 build/..

参考 : www.jianshu.com/p/d7567258a…

www.liaoxuefeng.com/wiki/125259…

www.jianshu.com/p/d6bcba24d…