使用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);
答案 0 :(得分: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);
答案 1 :(得分:0)
CodeBlock有一个加入的收集器,您可以使用它来流式传输它,并执行以下操作(例如,如果这是一个枚举)。您可以针对任何类型进行操作,只是地图会发生变化。
AnnotationSpec.builder(MyCustom.class)
.addMember(
"param",
"$L",
moduleTypes.stream()
.map(type -> CodeBlock.of("$T.$L", MyCustom.class, type))
.collect(CodeBlock.joining(",", "{", "}")))
.build()