简体   繁体   English

将数组作为 JavaPoet 中注释参数的值传递

[英]Pass array as value of annotation param in JavaPoet

Using JavaPoet I'm trying to annotate a class with an annotation which has an array as a parameter value ie使用 JavaPoet 我试图用一个注释来注释一个类,它有一个数组作为参数值,即

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

I use AnnotationSpec.builder and its addMember() method:我使用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);

Maybe not an optimal solution but passing an array to an annotation in JavaPoet can be done in the following way:也许不是最佳解决方案,但可以通过以下方式将数组传递给 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);

CodeBlock has a joining collector, and you can use that to stream this, doing something like the following (if for instance this was an enum). CodeBlock 有一个连接收集器,您可以使用它来流式传输它,执行如下操作(例如,如果这是一个枚举)。 You can do it for any types, just the map would change.您可以为任何类型执行此操作,只是地图会更改。

AnnotationSpec.builder(MyCustom.class)
   .addMember(
      "param",
      "$L",
      moduleTypes.stream()
         .map(type -> CodeBlock.of("$T.$L", MyCustom.class, type))
         .collect(CodeBlock.joining(",", "{", "}")))
   .build()

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

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