Как заставить 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 в качестве значения аннотации?


person Jorn    schedule 09.09.2016    source источник


Ответы (1)


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

TypeSpec.classBuilder("GeneratedClass")
            .addModifiers(Modifier.PUBLIC)
            .addSuperinterface(MyService.class)
            .addAnnotation(
                    AnnotationSpec.builder(AutoService.class).addMember(
                    "value", "$T.class", MyService.class).build()
            ).build();
person David Pérez Cabrera    schedule 09.09.2016
comment
Я не знаю другого способа сделать это. Я предполагаю, что это было рекомендовано, потому что format является String, а не Enum. - person David Pérez Cabrera; 09.09.2016
comment
Как насчет того, когда вы имеете дело с ParameterizedTypeName? - person WouterH; 25.12.2016