2

使用JavaPoet我试图用一个具有数组作为参数值的注释来注释一个类,即

@MyCustom(param = { Bar.class, Another.class })
class Foo { 
}

我使用AnnotationSpec.builder及其addMember()方法:

List<TypeMirror> moduleTypes = new ArrayList<>(map.keySet());
AnnotationSpec annotationSpec = AnnotationSpec.builder(MyCustom.class)
   .addMember("param", "{ $T[] } ", moduleTypes.toArray() )
   .build();
builder.addAnnotation(annotationSpec);
4

2 回答 2

1

CodeBlock 有一个加入收集器,您可以使用它来流式传输它,执行以下操作(例如,如果这是一个枚举)。您可以对任何类型执行此操作,只是地图会更改。

AnnotationSpec.builder(MyCustom.class)
   .addMember(
      "param",
      "$L",
      moduleTypes.stream()
         .map(type -> CodeBlock.of("$T.$L", MyCustom.class, type))
         .collect(CodeBlock.joining(",", "{", "}")))
   .build()
于 2020-05-04T16:19:24.807 回答
0

也许不是最佳解决方案,但可以通过以下方式将数组传递给 JavaPoet 中的注释:

List<TypeMirror> moduleTypes = new ArrayList<>(map.keySet());
CodeBlock.Builder codeBuilder  = CodeBlock.builder();
boolean arrayStart = true;
codeBuilder.add("{ ");
for (TypeMirror modType: moduleTypes)
    if (!arrayStart)
        codeBuilder.add(" , ");
    arrayStart = false;
    codeBuilder.add("$T.class", modType);
codeBuilder.add(" }");

AnnotationSpec annotationSpec = AnnotationSpec.builder(MyCustom.class)
    .addMember("param", codeBuilder.build() )
    .build();
builder.addAnnotation(annotationSpec);
于 2017-03-07T14:30:53.870 回答