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

本文介绍了一种使用Java注解处理器从模板文件读取内容并生成类文件的方法。通过解析模板文件,利用编译时注解处理器替换模板变量,最终生成指定的Java类。此过程涉及读取模板文件、解析模板变量、生成Java文件等多个步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

补充一个读取模板文件生成类的方法过程。
在这里插入图片描述
模板文件内容:

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;
    }

}

编译时注解学习一之 Element元素
编译时注解学习二之 注解处理器初探AbstractProcessor
编译时注解学习三之 注解处理器AbstractProcessor工具和Element属性简述
编译期注解学习四 简单的view注入框架
编译期注解学习五 - ElementKind,TypeKind,不同Element类型判断
编译期注解学习六- 生成java文件javapoet
编译期注解学习七-如何进行调试
编译时注解学习八 -模板文件读取

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值