繁体   English   中英

注释处理器:初始化字段

[英]Annotation Processor : initialize a field

我在android中编写一个注释处理器,生成一个java文件。 我正在使用JavaPoet库。

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

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

 private final List<String> names;

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

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

现在,问题是:如何从处理器初始化names字段? Javapoet api为字段提供了initializer ,但只需要一个字符串。 在我的处理器中,我有支持注释的类列表。 我想用该列表填充此字段。

如您所知,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类。

希望这些信息仍然有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM