美文网首页
编译时注解(转)

编译时注解(转)

作者: 柒黍 | 来源:发表于2017-09-14 22:59 被阅读0次

原文http://fucknmb.com/2017/02/07/%E7%BC%96%E8%AF%91%E6%97%B6%E6%B3%A8%E8%A7%A35%E6%AD%A5%E8%B5%B0/

新建Java Module
http://fucknmb.com/2017/02/07/%E7%BC%96%E8%AF%91%E6%97%B6%E6%B3%A8%E8%A7%A35%E6%AD%A5%E8%B5%B0/new-module.png

引入auto-service(自动生成services下文件)和javapoet(生成java文件)

compile 'com.google.auto.service:auto-service:1.0-rc2'
compile 'com.squareup:javapoet:1.8.0'

编写注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
@Inherited
public @interface Api {
    String scope();
    String name();
    String version();
}

创建AbstractProcessor实现类

重写getSupportedSourceVersion,getSupportedAnnotationTypes和process方法。注意在类上加入注解AutoService,便会自动生成META-INF下的services文件

@AutoService(Processor.class)
public class AnnotationProcessor extends AbstractProcessor {
    @Override
    public SourceVersion getSupportedSourceVersion() {
        return SourceVersion.latestSupported();
    }
    @Override
    public Set<String> getSupportedAnnotationTypes() {
        Set<String> supportedAnnotationTypes = new HashSet<>();
        supportedAnnotationTypes.add(Api.class.getCanonicalName());
        return supportedAnnotationTypes;
    }
    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        return false;
    }
}

实现process方法,根据注解生成对应代码

public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
    Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(Api.class);
    for (Element e : elements) {
        //获得对应的注解
        Api api = e.getAnnotation(Api.class);
        System.out.println("*");
        //使用javapoet开始生成代码
        TypeSpec clazz = TypeSpec.classBuilder(api.name().toUpperCase() + "Request")
                .addJavadoc("Generated request for network\n")
                .addSuperinterface(Serializable.class)
                .build();
        JavaFile javaFile = JavaFile.builder("com.funcknmb.api", clazz)
                .build();
        //生成的代码写入文件
        try {
            JavaFileObject fileObject = processingEnv.getFiler().createSourceFile("com.funcknmb.api." + api.name().toUpperCase() + "Request");
            processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "Creating " + fileObject.toUri());
            Writer writer = fileObject.openWriter();
            javaFile.writeTo(writer);
            writer.close();
        } catch (IOException x) {
            processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, x.toString());
        }
    }
    return false;
}

总结

编写的注解以及process的实现只是做个模板,具体情况视情况而定。

相关文章

  • 编译时注解(转)

    原文http://fucknmb.com/2017/02/07/%E7%BC%96%E8%AF%91%E6%97%...

  • 编译时注解器初探(一)

    编译时注解器初探(一) 注解处理器 (Annotation Processor) 编译时注解和运行时注解定义的方式...

  • 编译时注解

    今天在写一个框架时用到编译时注解,在传maven的时候老是传不上去,最后发现点击upload时会执行所有的上传ta...

  • java注解

    一、注解分类 源码注解(SOURCE):注解只在源码中存在,编译成.class文件就不存在 编译时注解(CLASS...

  • Android编译时注解初级之ButterKnife

    本文的主要目的在于了解编译时注解,并能初步运用。代码在最后。 1.编译时注解 VS 运行时注解 1.1 运行时注解...

  • 参阅ButterKnife源码,对编译时注解(Annotatio

    编译时注解 运行时注解和编译时注解,两种注解方式对性能的影响是不一样的。之前看到相关资料,都说对于注解的优化,都用...

  • java常用注解分类

    1)按照运行机制划分: 【源码注解→编译时注解→运行时注解】 源码注解:只在源码中存在,编译成.class文件就不...

  • ButterKnife源码解析

    参考1参考2参考3参考4 一:基本原理 编译时注解+APT编译时注解:Rentention为CLASS的直接。保留...

  • Android APT注解处理器

    一、编译时技术简介APT ( Annotation Processing Tool ) 注解处理工具 ; 编译时技...

  • 编译时注解处理方

    编译时注解处理 若希望对编译时的注解进行处理需要做 自定义类集成自AbstractProcessor 重写其中的p...

网友评论

      本文标题:编译时注解(转)

      本文链接:https://www.haomeiwen.com/subject/vkpjsxtx.html