Пользовательские аннотации Java принимают другую аннотацию

#java

#java

Вопрос:

как я могу написать пользовательскую аннотацию, которая принимает другую аннотацию и значения?

 @Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation{
  Class<? extends TestAnnotationChild> annotation();
}
  

Вторая аннотация

 @Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotationChild{

}
  

И я хотел бы сделать что-то вроде

 @TestAnnotation(@TestAnnotationChild={values})
  

Как я могу сделать что-то подобное?

Ответ №1:

Вот как это делается.

 @Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
   TestAnnotationChild child();

   // Or for an array
   TestAnnotationChild[] children();
}
  

Использование

 @TestAnnotation(
        @TestAnnotationChild(
               value = "42",
               anotherValue = 42
        )
)
  

Однако эта часть вашего заявления

и значения

это заставляет меня думать, что вы хотите сделать что-то необычное.
Не могли бы вы уточнить?

Ответ №2:

Вы должны просто использовать TestAnnotationChild value(); вместо Class<? extends TestAnnotationChild> annotation(); .

 @Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation{
  TestAnnotationChild value();
}
  
 @Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotationChild {
    // String or whatever Object you want
    String[] value();
}
  

Теперь вы можете использовать аннотации по своему усмотрению:

 @TestAnnotation(@TestAnnotationChild({"TEST"}))
  

Ответ №3:

у вас может просто быть свойство типа TestAnnotationChild в вашем TestAnnotation , точно так же, как это была строка, или что-то еще