Java Повторяемая аннотация не распознается, если используется только один параметр - PullRequest
1 голос
/ 14 января 2020

Я хочу создать класс параметров, который содержит структуру ключ-значение.

Эта карта заполнена содержимым файла конфигурации во время выполнения.

Чтобы проверить, что я хочу настроить, определите необходимые ключи для аннотации класса Option, например:

// Map must contain a entry with key 'foo' and key 'bar'
@requiredKey("foo")
@requiredKey("bar")
class Options {
   Map<String, String> optionsMap;
}

Поэтому я создал повторяющуюся аннотацию:

@Retention(RetentionPolicy.RUNTIME)
public @interface requiredKeys {
    requireKey[] value();
}

@Repeatable(requiredKeys)
public @interface requredKey {
    String value();
}

Во время выполнения я звоню requiredKey[] anno = options.getAnnotationsByType(requiredKey.class))

Это прекрасно работает, если количество указанных аннотаций> 1. Но если число аннотации ровно одна, я не могу их получить (getAnnotationsByType возвращает пустой массив)

работает:

@requiredKey("foo")
@requiredKey("bar")
class Options {
   Map<String, String> optionsMap;
}

// anno holds 'foo' and 'bar'
requiredKey[] anno = options.getAnnotationsByType(requiredKey.class))

не работает:

@requiredKey("foo")
class Options {
   Map<String, String> optionsMap;
}

// anno is empty
requiredKey[] anno = options.getAnnotationsByType(requiredKey.class))

Не знаю Я не могу понять это поведение :(

Итак, мои вопросы:

  • Каково объяснение такого поведения?
  • Как я могу заставить это работать?

Спасибо

1 Ответ

0 голосов
/ 14 января 2020

Вам необходимо добавить в свою @requiredKey политику хранения:

@Retention(RetentionPolicy.RUNTIME)
@Repeatable(requiredKeys)
public @interface requredKey {
    String value();
}

Если этого не сделать, то при создании класса с одной аннотацией Java не создает requiredKeys аннотация, потому что у вас есть только один Annotation. Поэтому применяется политика хранения @requiredKey. В вашем случае у вас их не было, что означает, что ваша аннотация не будет видна JVM.

Другие комментарии: Пожалуйста, используйте заглавную букву для вашего класса / аннотаций.

@Retention(RetentionPolicy.RUNTIME)
public @interface RequiredKeys {
    requireKey[] value();
}

@Repeatable(RequiredKeys)
public @interface RequiredKey {
    String value();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...