JavaPoet如何生成没有名字的注解?

How Do I Generate an Annotation Without a Name with JavaPoet?

假设我想用 @RunWith(AndroidJUnit4.class) 之类的东西注释 class。一般的 JavaPoet 配方是:

  private static ClassName RUN_WITH=ClassName.get("org.junit.runner", "RunWith");
  private static ClassName ANDROID_JUNIT4=ClassName.get("android.support.test.runner", "AndroidJUnit4");

  private TypeSpec buildTestClass() {
    return TypeSpec.classBuilder("MainActivityTest")
      .addModifiers(Modifier.PUBLIC)
      .addAnnotation(AnnotationSpec.builder(RUN_WITH)
        .addMember(null, "$T.class", ANDROID_JUNIT4)
        .build())
      .build();
  }

但是,AnnotationSpec.Builder 上的两个 addMember() 方法每个都需要一个成员名称...而我不需要名称。我尝试了 null,如上所示,结果生成:

@RunWith(
    null = AndroidJUnit4.class
)

那么...我们如何生成 "anonymous"(或任何用于单个未命名成员的正确术语)注释?

要使用的魔法名称是 value:

  private static ClassName RUN_WITH=ClassName.get("org.junit.runner", "RunWith");
  private static ClassName ANDROID_JUNIT4=ClassName.get("android.support.test.runner", "AndroidJUnit4");

  private TypeSpec buildTestClass() {
    return TypeSpec.classBuilder("MainActivityTest")
      .addModifiers(Modifier.PUBLIC)
      .addAnnotation(AnnotationSpec.builder(RUN_WITH)
        .addMember("value", "$T.class", ANDROID_JUNIT4)
        .build())
      .build();
  }

这会根据需要生成 @RunWith(AndroidJUnit4.class)