2016-10-21 2 views
2

내에서 주석을 작성하는 방법을 나는 아래의 주석으로 표현 생성 할JavaPoet : 나는 아래의 코드를 시도 <pre><code>@NamedQueries({@NamedQuery(name = "E.findAll", query = "SELECT e FROM E e")}) </code></pre> <p></p>가 : 주석

.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이 문자열이 필요를; 이 표현식은 오류를 발생시킵니다. 어떻게 재귀 적 표현을 얻을 수 있습니까?

주석 안에 다른 주석을 작성할 수 있습니까?

답변

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은 훌륭한 소스입니다.

+0

나는 아래의 결과를 얻을 : @NamedQueries을 ( = @NamedQuery (이름 = "E.findAll"쿼리 =) "E 전자에서 전자를 선택") 을하지만 난 @NamedQueries이 필요합니다 ({@ NamedQuery (name = "E.findAll", query = "SELECT e FROM E e")}) 대신에 괄호를 추가하는 것이 가능합니다. 다시 한번 감사드립니다. – RedArrow