一,只使用Java注解处理器
demo请看 github
说明:(lib_annotation和lib_processor可以写到一个lib里)
-
javalib annotation:定义注解。
-
javalib processor:处理注解。
2.1. 引入javalib annotation;
2.2. 指明注解类:在main文件夹中新建resources文件 -> META-INF -> services -> javax.annotation.processing.Processor -> 内容com.goals.lib_processor.MyProcessor(可不用写分号结束)2.3. 写注解处理类,继承AbstractProcessor类
@SupportedSourceVersion(SourceVersion.RELEASE_8) //指定注解处理类 @SupportedAnnotationTypes("com.goals.lib_annotation.MyAnnotation") public class MyProcessor extends AbstractProcessor { @Override public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) { processingEnv.getMessager().printMessage( Diagnostic.Kind.NOTE, "----------my_processor processing-----------" ); //找到所有使用了注解的类的集合 for (Element element: roundEnvironment.getElementsAnnotatedWith(MyAnnotation.class)){ processingEnv.getMessager().printMessage( Diagnostic.Kind.NOTE, "---------------------" ); //判断元素的类型为class if (element.getKind() == ElementKind.CLASS){ //显示转换元素类型 TypeElement typeElement = (TypeElement) element; //输出元素名称 processingEnv.getMessager().printMessage( Diagnostic.Kind.NOTE, typeElement.getSimpleName() ); //输出元素需要打印的值 processingEnv.getMessager().printMessage( Diagnostic.Kind.NOTE, typeElement.getAnnotation(MyAnnotation.class).value() ); } processingEnv.getMessager().printMessage( Diagnostic.Kind.NOTE, "-----------------------" ); } return false; } /** * 要重写这个方法,再次指定注解处理的类是哪个 * @return */ @Override public Set<String> getSupportedAnnotationTypes() { Set<String> annotations = new LinkedHashSet<>(); annotations.add(MyAnnotation.class.getCanonicalName()); // return super.getSupportedAnnotationTypes(); return annotations; }
-
app:使用注解
3.1 使用:@MyAnnotation("hello world") public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
3.2 引入:
implementation project(path: ':lib_annotation'); //如果只使用annotationProcessor,会产生只有第一次编译才生效,后边就不生效的问题。 //如果加上implementation,每次编译都能打印出注解传递的值 implementation project(path: ':lib_processor'); annotationProcessor project(path: ':lib_processor');
二,使用google auto-services处理注解
项目结构一样,依赖关系也是一样的
demo请看 github
说明:
- lib_annotation:还是原来一样的,只是加入了google auto-services最好使用JavaVersion.VERSION_1_8避免兼容性问题。
- app也是一样:lib_processor的引入需要使用两个,implementation和annotationProcessor
implementation project(path: ':lib_annotation') annotationProcessor project(path: ':lib_processor') implementation project(path: ':lib_processor')
- lib_processor:
3.1. 引入javalib annotation;
3.2. 引入google auto-services
3.2. 与使用Java注解处理器不同,这里不需要指明注解类!!!:不用在main文件夹中新建resources文件 -> META-INF -> services -> javax.annotation.processing.Processor -> 内容。com.goals.lib_processor.MyProcessor(可不用写分号结束)。这个内容会由google auto-service自动在编译时给你自动生成。implementation project(path: ':lib_annotation'); //同样需要两个auto-service引入,一个implementation,一个annotationProcessor // https://mvnrepository.com/artifact/com.google.auto.service/auto-service implementation 'com.google.auto.service:auto-service:1.0.1' annotationProcessor 'com.google.auto.service:auto-service:1.0.1'
3.3. 写注解处理类,继承AbstractProcessor类import javax.annotation.processing.Processor; @SupportedSourceVersion(SourceVersion.RELEASE_8) //指定注解处理类 //java 注解处理写法 //@SupportedAnnotationTypes("com.goals.lib_annotation.MyAnnotation") //google auto-services处理注解写法 @AutoService(Processor.class) public class MyProcessor extends AbstractProcessor { @Override public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) { //同上 } /** * 这个方法一定要重写,不然注解处理不会生效 * 要重写这个方法,再次指定注解处理的类是哪个 * @return */ @Override public Set<String> getSupportedAnnotationTypes() { Set<String> annotations = new LinkedHashSet<>(); annotations.add(MyAnnotation.class.getCanonicalName()); // return super.getSupportedAnnotationTypes(); return annotations; }