Я думаю, что это может быть невозможно в Java, потому что аннотация и ее параметры разрешаются во время компиляции. У меня есть интерфейс следующим образом,
public interface FieldValues {
String[] FIELD1 = new String[]{"value1", "value2"};
}
и другой класс как,
@SomeAnnotation(locations = {"value1", "value2"})
public class MyClass {
....
}
Я отмечаю многие классы аннотацией, и я хотел бы знать, могу ли я избежать указания строк в каждой аннотации, которую я вместо этого предпочел бы использовать
@SomeAnnotation(locations = FieldValues.FIELD1)
public class MyClass {
....
}
Однако это приводит к ошибкам компиляции, таким как значение аннотации должно быть инициализатором массива и т. Д. Кто-нибудь знает, как я могу использовать константу String или константу String [] для предоставления значения аннотации?
источник
enum
в аннотациях, но они не являются константами времени компиляции. Разница становится очевидной, когда вы пишетеstatic final EnumType VARIABLE = EnumType.ENUM_CONSTANT;
и пытаетесь использоватьVARIABLE
в аннотации; это не сработает. Вы можете использовать только то,EnumType.ENUM_CONSTANT
которое не является константным выражением, но специально разрешено в аннотациях (иswitch
утверждениях).Вы можете использовать константу (то есть статическую, конечную переменную) в качестве параметра для аннотации. В качестве быстрого примера я использую что-то вроде этого довольно часто:
Обратите внимание, что
TEST_TIMEOUT
константу можно передать прямо в аннотацию.Случайно, я не помню, чтобы когда-либо пробовал это с массивом, поэтому вы можете столкнуться с некоторыми проблемами с небольшими различиями в том, как массивы представляются как параметры аннотации по сравнению с переменными Java? Но что касается другой части вашего вопроса, вы можете без проблем использовать постоянную строку.
EDIT: Я просто попытался это с массивом Струнный и не столкнуться с проблемой , вы упомянули - однако компилятор ничего сказать мне , что «значение атрибута должно быть постоянной» , несмотря на массив определяется как
public static final String[]
. Возможно, ему не нравится тот факт, что массивы изменчивы? Хм ...источник
Вы не предоставляете ему массив в вашем примере. Следующее компилируется нормально:
источник
К сожалению, вы не можете сделать это с массивами. С переменными, не являющимися массивами, значение должно быть окончательным статическим.
источник
С помощью Seam 2 http://seamframework.org/ вы смогли разрешить параметры аннотаций во время выполнения с помощью языка выражений в двойных кавычках.
В Seam 3 http://seamframework.org/Seam3/Solder эта функция представляет собой модуль Seam Solder
источник
Вы можете использовать enum и ссылаться на enum в поле аннотации.
источник