JavaPoet:如何在注释中构建注释
JavaPoet: how to build annotation within annotation
我尝试生成带有以下注释的表达式:
@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");
This test 是一个很好的示例来源。
我尝试生成带有以下注释的表达式:
@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");
This test 是一个很好的示例来源。