#java #spring-boot #reflection #java-8 #java-annotations
#java #spring-boot #отражение #java-8 #java-аннотации
Вопрос:
Мне нужна ваша поддержка и спасибо за вашу поддержку Java / Annotations..
Я бы хотел создать пользовательскую аннотацию, например @ModifyRegex, для аннотирования переменных, и мой подход заключается в изменении / замене частей значения аннотированных переменных.
f.e.
@ModifyRegex
private String variable;
if:
variable = "AbC-ABG-kkkk-4711";
then:
variable = "ABC-4711-ABG-kkkk";
Я не уверен, возможно ли это или нет, если да, пожалуйста, предоставьте мне простой пример кода..
Спасибо
Комментарии:
1. Добро пожаловать в SO. Похоже, вы сваливаете на нас свою проблему. Все будет работать лучше, когда вы сначала добьетесь прогресса самостоятельно и сообщите нам, что вы пробовали до сих пор,.
Ответ №1:
Обработчики аннотаций могут создавать новые исходные файлы. Они не могут изменить существующие. Они также не могут читать внутренние методы. На самом деле они не могут прочитать никакой код, поэтому единственный строковый литерал, который вы могли бы увидеть, — это если это буквально (хех) литерал. Спецификация java lang определяет, когда значение, присвоенное полю, считается «постоянной времени компиляции» и записывается прямо. Если это не так, скажем:
class Example {
// these are all NOT constant, therefore, cannot be
// retrieved with an annotation processor
long x = System.currentTimeMillis();
Pattern p = Pattern.compile("^AbC-ABG-$");
String s = null; // null is considered non-constant, for some reason.
String z = "HELLO!".toLowerCase();
}
Но, если это действительно просто, например, @Foo private String x = "Hello";
где x
находится поле (а не локальная переменная в каком-то методе), да, вы можете увидеть это в действии.
Но все, что вы можете сделать, это создать новые файлы. Вы не можете изменить существующий файл. Таким образом, в лучшем случае вы можете создать второй класс, который содержит public static final String variable2 = "ABC-4711-...";
.
Но как насчет ломбока?
Project Lombok делает все, что я только что сказал, что вы не можете сделать: он проверяет фактический код и изменяет исходные файлы в процессе работы.
К сожалению, lombok — это несколько сотен тысяч строк кода, и большая его часть необходима для выполнения всего этого: нет единого способа сделать это, поэтому это тонна пользовательского кода. Более того, это также чрезвычайно сложно: IDE постоянно анализируют код, и если вы меняете структуры, это влияет на все: от «автоматического форматирования моего файла по мере его сохранения» до рефакторинга скриптов, «поиска вызывающих абонентов» и многого другого. Поскольку стандарта не существует, вам нужно исправить редакторы, чтобы понять это.
Изменение строковой константы может означать, что вам не нужно столько исправлений. Тогда это все еще невероятно сложно.
Lombok с открытым исходным кодом, если вы хотите исследовать.
ПРИМЕЧАНИЕ: я являюсь основным участником Project Lombok.
Комментарии:
1. Хотя я не могу не согласиться ни с чем из этого, я не могу не задаться вопросом, почему кто-то вообще пытается делать то, что хочет OP? Не является ли заполнение переменной экземпляра — даже если это возможно — аннотацией опасной и нечитаемой конструкцией?
2. @Kevin без сомнения 🙂