Android APT 动态注解处理笔记
创建项目AnnotationTester,包名com.viator42
由于Android对新版jdk的支持不完全,这里强制使用1.7版java
Module annotation
新建一个名称为annotation的Java Library
主要放置一些项目中需要使用到的Annotation和关联代码
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.CLASS)
public @interface TesterAnnotation {
String name() default "undefined";
String text() default "";
}
配置build.gradle,主要是规定jdk版本
apply plugin: 'java'
sourceCompatibility = 1.7
targetCompatibility = 1.7
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
module compiler
创建一个名为compiler的Java Library,这个类将会写代码生成的相关代码
配置build.gradle
apply plugin: 'java'
sourceCompatibility = 1.7
targetCompatibility = 1.7
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.google.auto.service:auto-service:1.0-rc2'
compile 'com.squareup:javapoet:1.7.0'
compile project(':annotation')
}
- 定义编译的jdk版本为1.7,这个很重要,不写会报错。
- AutoService 主要的作用是注解 processor 类,并对其生成 META-INF 的配置信息。
- JavaPoet 这个库的主要作用就是帮助我们通过类调用的形式来生成代码。
- 依赖上面创建的annotation Module。
定义Processor类
生成代码相关的逻辑就放在这里。
@AutoService(Processor.class)
public class TestingAnnnotationProcessor extends AbstractProcessor {
@Override
public synchronized void init(ProcessingEnvironment processingEnv) {
super.init(processingEnv);
}
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
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.viator42.annotationtester", helloWorld)
.build();
try {
javaFile.writeTo(processingEnv.getFiler());
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
@Override
public Set<String> getSupportedAnnotationTypes() {
return Collections.singleton(TesterAnnotation.class.getCanonicalName());
}
@Override
public SourceVersion getSupportedSourceVersion() {
return SourceVersion.RELEASE_7;
}
}
build.gradle配置
apply plugin: 'java-library'
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.google.auto.service:auto-service:1.0-rc2'
implementation 'com.squareup:javapoet:1.7.0'
implementation project(':annotation')
}
sourceCompatibility = "7"
targetCompatibility = "7"
在app中使用
配置项目根目录的build.gradle
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
app module的build.gradle配置
android {
...
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
}
dependencies {
...
apply plugin: 'com.android.application'
implementation project(':annotation')
annotationProcessor project(':compiler')
}
对一个类添加注解
@TesterAnnotation(
name="viator42",
text="hello viator42"
)
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
然后就能在以下路径找到生成的Java Class
AnnotationTester\app\build\generated\source\apt\debug\com\viator42\annotationtester\HelloWorld.java