1

我正在android中编写一个注释处理器,它生成一个java文件。我正在JavaPoet为此使用图书馆。

生成文件的目的:它应该有一个带有我的处理器支持的特定注释的类的名称列表,并提供一个公共方法来获取该列表。

现在,我已经生成了文件:

 private final List<String> names;

 GeneratedFile(ArrayList<String> names) {
    this.names = names;
 }

 public List<String> getNames() {
   return names;
}

现在,问题是:如何names从处理器初始化字段?Javapoetapi 为字段提供了一个,initializer但只接受一个字符串。在我的处理器中,我列出了具有我支持的注释的类。我想用那个列表填充这个字段。

4

1 回答 1

0

如您所知,JavaPoet 仅提供一个字符串来指定字段初始化。要完成您的任务,您必须(我将向您展示一些并非特定于您的问题的代码,但它可以作为一个很好的示例向您展示如何做到这一点):

  • 从注释处理器中获取带有注释的类列表(代码是从我的库中复制的):

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        model = new PrefsModel();
    
        parseBindType(roundEnv);
    
        // Put all @BindSharedPreferences elements in beanElements
        for (Element item : roundEnv.getElementsAnnotatedWith(BindSharedPreferences.class)) {
            AssertKripton.assertTrueOrInvalidKindForAnnotationException(item.getKind() == ElementKind.CLASS, item, BindSharedPreferences.class);
    
          // store type name somewhere
        }
    
        return true;
    }
    
  • 使用这组 TypeName 为您的字段生成初始值:

    ...
    Builder sp = FieldSpec.builder(ArrayTypeName.of(String.class), "COLUMNS", Modifier.STATIC, Modifier.PRIVATE,
        Modifier.FINAL);
    String s = "";
    StringBuilder buffer = new StringBuilder();
    for (SQLProperty property : entity.getCollection()) {
      buffer.append(s + "COLUMN_" + 
         columnNameToUpperCaseConverter.convert(property.getName()));
     s = ", ";
    }
    classBuilder.addField(sp.addJavadoc("Columns array\n").initializer("{" + 
      buffer.toString() + "}").build());    
    ...
    

你会在github上找到我的库。特别是,您必须阅读课程com.abubusoft.kripton.processor.sqlite.BindTableGenerator

希望这些信息仍然有用。

于 2018-07-09T00:55:42.710 回答