美文网首页
编译时注解学习八 -模板文件读取

编译时注解学习八 -模板文件读取

作者: sliencexiu | 来源:发表于2019-08-02 09:17 被阅读0次

补充一个读取模板文件生成类的方法过程。


项目结构,模板放置位置

模板文件内容:

package %package%;

public class %classname% {

    private String name;
    private int data;

    private void setName(String name){
        this.name = name;
    }

    private String getName(){
        return name;
    }

    private void setData(){
        data = %data%;
    }

    private int getData(){
        return data;
    }

}

读取模板文件的工具:

//文件名写法 /temp/template
 public static String getTempFileString( String file ) {

        BufferedReader reader = new BufferedReader( new InputStreamReader( Utils.class.getResourceAsStream( file ) ) );
        StringBuilder builder = new StringBuilder();
        try {
            String line;
            while ( ( line = reader.readLine() ) != null ) {
                builder.append( line ).append( "\n" );
            }
            reader.close();
        } catch ( IOException e ) {
            try {
                reader.close();
            } catch ( IOException e1 ) {
            }
        }

        return builder.toString();
    }

processor文件写法:

@SupportedOptions({"CLASSNAME"})
@SupportedAnnotationTypes("com.ldx.annotationlib.Template")
@SupportedSourceVersion(SourceVersion.RELEASE_7)
@AutoService(Processor.class)
public class AptProcessor5 extends AbstractProcessor  {

    private Filer mFilerUtils;
    private Types mTypesUtils;
    private Elements mElementsUtils;
    private Messager mMessager;
    private Map<String,String> mOptionMap;
    private ArrayList<VariableElement> mElementList;

    @Override
    public synchronized void init(ProcessingEnvironment processingEnvironment) {
        super.init(processingEnvironment);
        mFilerUtils = processingEnv.getFiler();
        mTypesUtils = processingEnv.getTypeUtils();
        mElementsUtils = processingEnv.getElementUtils();
        mMessager = processingEnv.getMessager();
        mOptionMap = processingEnv.getOptions();
        mElementList = new ArrayList<>();
    }

    @Override
    public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
        if (set != null && set.size() > 0){

            Set<? extends Element>  elements = roundEnvironment.getElementsAnnotatedWith(Template.class);
            for (Element element : elements) {
                VariableElement variableElement = (VariableElement) element;
                mElementList.add(variableElement);
            }

            createFile(mElementList);

            return true;
        }
        return false;
    }

    private void createFile(ArrayList<VariableElement> mElementList) {
        TypeElement enclosingElement = (TypeElement) mElementList.get(0).getEnclosingElement();
        String pkName = mElementsUtils.getPackageOf(enclosingElement).getQualifiedName().toString();
        String packName = mElementsUtils.getPackageOf(enclosingElement).asType().toString();
        String className = enclosingElement.getSimpleName().toString();

        try {
            JavaFileObject jfo = mFilerUtils.createSourceFile(pkName + "."+className+ "Template", new Element[]{});
            Writer writer = jfo.openWriter();
            String data = Utils.getTempFileString("/temp/template");
            if (data != null){
                data = data.replace("%classname%", className+ "Template");
                data = data.replace("%package%", pkName);
                data = data.replace("%data%", "2");
            }
            writer.write(data);
            writer.flush();
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

最终生成的文件

生成的文件
package com.ldx.canvasdrawdemo.activity;

public class BindViewActivityTemplate {

    private String name;
    private int data;

    private void setName(String name){
        this.name = name;
    }

    private String getName(){
        return name;
    }

    private void setData(){
        data = 2;
    }

    private int getData(){
        return data;
    }

}

相关文章

  • 编译时注解学习八 -模板文件读取

    补充一个读取模板文件生成类的方法过程。 模板文件内容: 读取模板文件的工具: processor文件写法: 最终生...

  • 编译期注解学习六- 生成java文件javapoet

    1 生成文件方式 编译期注解通过读取注解,然后处理注解字段Element,最终的目的是在编译代码之前生成所需源码文...

  • Java注解

    注解分类 源码注解:只在源码中存在,编译成.class文件就不存在了 编译时注解:在源码和.class文件中都存在...

  • java注解

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

  • Spring Boot最常用的读取properties配置文件中

    1、使用@Value注解读取 读取properties配置文件时,默认读取的是application.proper...

  • 编译时注解学习三之 注解处理器AbstractProcessor

    1 如何读取build.gradle配置的常量 配置,读取: build.gradle中配置(如何配置编译时注解变...

  • java常用注解分类

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

  • java自定义注解

    一、注解按照运行机制分类: 源码注解:注解只在源码中存在,.class文件就没了编译时注解:注解在源码和.clas...

  • 注解处理器

    一、注解 在类,接口,变量,方法前面的声明,注解的作用是对这些元素进行注释说明,不会影响编译器,通过编译器读取注解...

  • Linux Makefile文件模板

    1、编译驱动的Makefile文件模板: 2、编译c/c++文件的Makefile文件模板: 3、带文件夹的文件模...

网友评论

      本文标题:编译时注解学习八 -模板文件读取

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