【问题标题】:JavaPoet: how to build annotation within annotationJavaPoet:如何在注解中构建注解
【发布时间】:2016-10-22 08:04:37
【问题描述】:

我尝试用下面的注释生成表达式:

@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 需要字符串;这个表达式给出了错误。那么如何获得递归表达式。

是否可以在注解中构建另一个注解?

【问题讨论】:

    标签: java javapoet


    【解决方案1】:

    是的。使用 $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") ) 但我需要 @NamedQueries({@NamedQuery( name = "E.findAll", query = "SELECT e FROM E e")}) 代替相等是否可以添加括号,再次感谢
    猜你喜欢
    • 2019-07-04
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    • 1970-01-01
    • 2014-02-06
    相关资源
    最近更新 更多