Получить имя члена закрытого класса

Я разрабатываю объект Hibernate Pre-Update Event Listener с Java 8.

Я создал класс StateTracker, который из PreUpdateEvent получает новое и старое состояние объекта и имя параметра. Этот класс сопоставляет имена параметров с соответствующей парой старых и новых состояний и отложенным вычислением Boolean hasChanged и выполняет запрос карты по ключу (который имеет тип Строка), доступная через общедоступный метод.

Проблема в следующем: мне нужно проверить, изменится ли состояние определенного свойства объекта A, скажем, с именем var, в результате события обновления. Естественно это можно сделать так:

void foo(PreUpdateEvent event) {
    StateTracker stateTracker(event);
    if(stateTracker.isPropertyModified("var") {
        /* do stuff... */
    }
}

Я знаю, что не всегда могу спасти мир, но если кто-то изменит имя var на катастрофа в A , то приведенный выше код будет сломан, потому что даже самые умные из инструментов рефакторинга не увидят, что String "var" предназначена для представления имени параметра var (теперь катастрофа).

Я согласен с тем, что нет лучшего выхода из этой ситуации, но я хочу быть уверен, что это не способ получить имя переменной через отражение или что-то в этом роде.

В идеале это должно работать так:

void foo(PreUpdateEvent event) {
    StateTracker stateTracker(event);
    if(stateTracker.isPropertyModified(A.class.var.getName()) { // Magic!
        /* do stuff... */
    }
}

Может быть, какое-то волшебство в области обработки аннотаций могло бы сотворить такое волшебство...


person Rodrigo Martins de Oliveira    schedule 24.10.2016    source источник
comment
Лучше всего провести модульный тест, чтобы убедиться, что используемое имя поля правильное.   -  person Peter Gelderbloem    schedule 24.10.2016
comment
@PeterGelderbloem отличное предложение, я собираюсь использовать модульные тесты   -  person Rodrigo Martins de Oliveira    schedule 02.11.2016


Ответы (1)


Да, пройдите простое отражение, переберите вкладки, создайте ключ хэш-набора - это имя поля, а значение - значение поля, затем каждый раз перебирайте свой набор, и если какое-либо состояние элемента изменилось/удалено, пометьте объект как обновленный

person HRgiger    schedule 24.10.2016
comment
или вместо значения вы можете использовать сгенерированный хэш значения, будет меньше потреблять памяти - person HRgiger; 24.10.2016
comment
Извините, но я не могу понять, как это решает проблему. Я не хочу помечать объект как обновленный, я хочу отфильтровать соответствующие обновления объекта на основе обновляемых определенных полей. Создание хэш-набора не избавит от риска того, что кто-то изменит имя поля и код рендеринга, использующий старое имя в StateTracker, не будет работать. - person Rodrigo Martins de Oliveira; 02.11.2016