java apt 工具,Android APT及基于APT的简单应用

前言:随着一些如ButterKnife,dagger等的开源注解框架的流行,APT的概念也越来越被熟知。这篇文章将介绍APT的概念,以及我们怎么利用APT来自定义一个注解。

一,APT的介绍

APT英文全称:Android annotation process tool是一种处理注释的工具,它对源代码文件进行检测找出其中的Annotation,使用Annotation进行额外的处理。

Annotation处理器在处理Annotation时可以根据源文件中的Annotation生成额外的源文件和其它的文件(文件具体内容由Annotation处理器的编写者决定),APT还会编译生成源文件和原来的源文件,将它们一起生成class文件。简言之:APT可以把注解,在编译时生成代码。

二,APT的处理要素

注解处理器(AbstractProcess)+代码处理(javaPoet)+处理器注册(AutoService)+apt

三,使用APT来处理annotation的流程

1.定义注解(如@automain)

2.定义注解处理器

3.在处理器里面完成处理方式,通常是生成java代码。

4.注册处理器

  5.利用APT完成如下图的工作内容。411e77210535bfe57ab26d622bec36b1.png

四,使用APT的简单项目

1.新建项目APTProject

2.在项目对应的build.gradle文件中添加APT工具依赖。位置如下所示:

dependencies {

classpath 'com.android.tools.build:gradle:2.2.3'

//添加APT依赖

classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'

}

复制代码

3.在对应的module的build.gradle文件中添加下面的依赖:

apply plugin: 'com.android.application'

//添加APT plugin

apply plugin: 'com.neenbedankt.android-apt'

复制代码

4.创建java Library Module,命名为apt-lib,并把这个module引入到app中。

a20d37c7ab7296d688b976b231b72ddc.png

编写如下的类:

@Target(ElementType.TYPE) //作用在类上

@Retention(RetentionPolicy.RUNTIME)//存活时间

public @interface AutoCreate {

}

复制代码

5.再创建一个java Library Module,命名为apt-process,并把这个module引入到app中。

4555a7d6be1ef2f9e69ee971f9d37c6e.png

6.编写下面的类来处理注解

package com.wjstudio;

import com.example.AutoCreat;

import com.google.auto.service.AutoService;

import com.squareup.javapoet.JavaFile;

import com.squareup.javapoet.MethodSpec;

import com.squareup.javapoet.TypeSpec;

import java.io.IOException;

import java.util.Collections;

import java.util.Set;

import javax.annotation.processing.AbstractProcessor;

import javax.annotation.processing.Processor;

import javax.annotation.processing.RoundEnvironment;

import javax.lang.model.element.Modifier;

import javax.lang.model.element.TypeElement;

/**

* 注解处理器

* 完成注解的处理

* 1.处理哪个注解

* 2.如何处理

*/

//注册处理器,告知APT,AutoCrate是由TestProcess处理@AutoService(Processor.class)public class TestProcess extends AbstractProcessor {

@Override

public Set getSupportedAnnotationTypes() {

//定义需要处理的注解

return Collections.singleton(AutoCreat.class.getCanonicalName());

}

@Override

public boolean process(Set extends TypeElement> annotations, RoundEnvironment roundEnv) {

//如何处理该注解

/*

* hello.java

public final class HelloWorld {

public static void main(String[] args) {

System.out.println("Hello, JavaPoet!");

}

}

*/

//文件

//文件内容--java代码生成工具javapoet

//MethodSpec:定义方法

//TypeSec:定义类

//JavaFile:生成.java文件

MethodSpec main = MethodSpec.methodBuilder("main")

.addModifiers(Modifier.PUBLIC, Modifier.STATIC)

.returns(void.class)

.addParameter(String[].class, "args")

.addStatement("$T.out.println($S)",System.class, "Hello, JavaPoet!")

.build();

TypeSpec helloWorld = TypeSpec.classBuilder("HelloWorld")

.addModifiers(Modifier.PUBLIC, Modifier.FINAL)

.addMethod(main)

.build();

JavaFile javaFile = JavaFile.builder("com.songwenju.aptproject", helloWorld)

.build();

try {

javaFile.writeTo(processingEnv.getFiler());

} catch (IOException e) {

e.printStackTrace();}

return false;

}

}

复制代码

需要再改lib中引入

compile 'com.squareup:javapoet:1.8.0'

compile 'com.google.auto.service:auto-service:1.0-rc2'

复制代码

这里为了方便解释加了汉字,在AndroidStudio中编译的时候不能加汉字。

7.在使用注解的地方添加依赖

compile project(':apt-process')

apt project(':apt-process')

复制代码

8.使用生成的注解

在app Module对应的 MainActivity上加上注解,如下,编译之后可以看到生成的java类。

@AutoCreatpublic

class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

}

}

复制代码

Rebuild之后,生成如下源代码:

7fae2c2488ef4516dde3f10723e565fa.png

至此完成了Apt的介绍和简单的应用。

例子详见github.com/songwenju/A…,如果对您有帮助,欢迎star和fork。

版权声明:本文为博主原创文章,转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值