2016-09-09 2 views
5

Я хочу использовать JavaPoet для генерации аннотации с литералом типа в качестве значения. Например:Как получить JavaPoet для генерации литерала класса?

@AutoService(MyService.class) 
public class GeneratedClass implements MyService { 
} 

Я пробовал все варианты, которые я могу думать, но ни одна работа:

TypeSpec.classBuilder("GeneratedClass") 
    .addModifiers(Modifier.PUBLIC) 
    .addSuperinterface(MyService.class) 
    .addAnnotation(
     AnnotationSpec.builder(AutoService.class).addMember(
      "value", "$L", MyService.class 
     ).build() 
    ) 

с использованием $L генерирует interface MyService

с использованием $T генерирует my.package.MyService, что близко, но пропускает часть .class.

с помощью $N выдает ошибку: expected name but was my.package.MyService

как я получаю его для создания MyService.class в качестве значения аннотаций?

ответ

2

Вы попробовали?

TypeSpec.classBuilder("GeneratedClass") 
      .addModifiers(Modifier.PUBLIC) 
      .addSuperinterface(MyService.class) 
      .addAnnotation(
        AnnotationSpec.builder(AutoService.class).addMember(
        "value", "$T.class", MyService.class).build() 
      ).build(); 
+0

Не знаю, как это сделать. Я предполагаю, что это было рекомендовано, потому что 'format' является' String', а не 'Enum'. –

+0

Это точно правильный путь. –

+0

Как насчет того, когда вы имеете дело с параметризованным типом имени? – WouterH

Смежные вопросы