我尝试生成下面带有注释的表达式:
@NamedQueries({@NamedQuery(name = "E.findAll", query = "SELECT e FROM E e")})
我尝试了下面的代码:
.addAnnotation(AnnotationSpec.builder(NamedQueries.class)
.addMember( AnnotationSpec.builder(NamedQuery.class)
.addMember("name", "$S", "E.findAll")
.addMember("query", "$S", "SELECT e FROM E e)
.build()).build())
但由于addMember
需要字符串;此表达式给出错误。那么我如何获得递归表达式。
是否可以在注释内构建另一个注释?
是的。使用$L
并传递该AnmotationSpec。
ClassName beef = ClassName.get(tacosPackage, "Beef");
ClassName chicken = ClassName.get(tacosPackage, "Chicken");
ClassName option = ClassName.get(tacosPackage, "Option");
ClassName mealDeal = ClassName.get(tacosPackage, "MealDeal");
TypeSpec menu = TypeSpec.classBuilder("Menu")
.addAnnotation(AnnotationSpec.builder(mealDeal)
.addMember("price", "$L", 500)
.addMember("options", "$L", AnnotationSpec.builder(option)
.addMember("name", "$S", "taco")
.addMember("meat", "$T.class", beef)
.build())
.addMember("options", "$L", AnnotationSpec.builder(option)
.addMember("name", "$S", "quesadilla")
.addMember("meat", "$T.class", chicken)
.build())
.build())
.build();
assertThat(toString(menu)).isEqualTo(""
+ "package com.squareup.tacos;\n"
+ "\n"
+ "@MealDeal(\n"
+ " price = 500,\n"
+ " options = {\n"
+ " @Option(name = \"taco\", meat = Beef.class),\n"
+ " @Option(name = \"quesadilla\", meat = Chicken.class)\n"
+ " }\n"
+ ")\n"
+ "class Menu {\n"
+ "}\n");
该测试是大量示例的来源。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句