Передать массив как значение параметра аннотации в JavaPoet
Используя 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);
1 ответ
CodeBlock имеет присоединяющийся сборщик, и вы можете использовать его для потоковой передачи, выполняя что-то вроде следующего (если, например, это было перечисление). Вы можете сделать это для любых типов, просто изменится карта.
AnnotationSpec.builder(MyCustom.class)
.addMember(
"param",
"$L",
moduleTypes.stream()
.map(type -> CodeBlock.of("$T.$L", MyCustom.class, type))
.collect(CodeBlock.joining(",", "{", "}")))
.build()
Возможно, не оптимальное решение, но передача массива в аннотацию в 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);