Предположим, у вас есть какая-то аннотация Annot
:
@Retention(/*your retention policy*/)
@Target(/*targeted element type*/)
public @interface Annot {
String value() default "Hello World!";
}
А в некотором связанном коде, скажем, процессоре аннотаций, вам нужно значение по умолчанию value()
Поле аннотации без имеет доступ к классу, помеченному @Annot
. Конечно, вы можете просто сделать
public static final String ANNOT_VALUE_DEFAULT = "Hello World!";
в своем классе процессора, а затем изменить в @Annot
:
String value() default Processor.ANNOT_VALUE_DEFAULT;
(Processor
- имя класса вашего процессора аннотаций ). Хотя это нормально работает с String
s, изменение @Annot
завершается неудачно, если типом value()
является enum
. Он может не работать и для других значений, но enum
является частью моего варианта использования, поэтому, если это не сработает, не имеет значения, будут ли работать другие типы.
Теперь, конечно, Самый простой способ решить эту проблему - просто указать значение по умолчанию, указанное в @Annot
и Processor
, отдельно. Но каждый программист знает, что дублированные константы вообще не очень хорошая идея. Возможно, вы захотите автоматически отражать изменения в одной части (например, @Annot
) в других частях (например, Processor
). Чтобы это работало, вы должны быть в состоянии сделать это:
var defaultVal = Annot.value(); // statically (without an instance annotated with @Annot) access default value
Итак, возможен ли этот доступ c каким-либо образом?
Частичное решение
Мне не нужно сейчас искать решение, так как я уже нашел полу-удобный обходной путь (см. Мой ответ). Тем не менее, поскольку обходной путь немного «хакерский», я хочу знать, есть ли более элегантный способ сделать это.