Изменить доступ к полю на доступ к методу getter/setter

Можно ли автоматически изменить доступ к полям внешнего класса в Java для вызовов getter/setter, а также скрыть открытые поля? Я использую Javabeans и хочу получать уведомления об изменениях при изменении свойства поля (это важно).

Я нашел cglib, который может автоматически вставлять вызов изменения свойства в поле PropertyChangeSupport. Я знаю о Project Lombok, но похоже, что он изменяет исходный код и, кроме того, не поддерживает изменение доступа к полям. Возможно, с модификациями Lombok это можно было бы поддерживать, или есть другие решения?

Удачи и спасибо заранее, Крис


person Chris Dennett    schedule 25.04.2010    source источник
comment
Похоже, что нельзя изменить сам код javabean. Это правда? Иначе были бы гораздо более простые способы.   -  person BalusC    schedule 26.04.2010
comment
Ну вообще что угодно. Все, что я хочу, это, скажем, у вас есть объект «k» с полем «p», и пользователь обращается к нему с помощью k.p = 5 или что-то в этом роде. Его следует изменить на k.setP(5). Подключаемые модули преобразования кода для Eclipse также приветствуются, но, как вы знаете, использование множества методов получения/установки в ограниченном пространстве может сделать код действительно очень запутанным.   -  person Chris Dennett    schedule 26.04.2010
comment
Просто сделать свойства private? Извините, но я совершенно потерял суть сейчас.   -  person BalusC    schedule 26.04.2010
comment
Это намерение, чтобы скрыть поля и изменить доступ к динамически переписанным геттерам/сеттерам, чтобы PropertyChangeSupport уведомлялся этими методами, когда эти переменные изменяются.   -  person Chris Dennett    schedule 26.04.2010


Ответы (2)


Самый простой вариант — изменить источник клиентов API. Предполагая, что это не вариант, нет способа автоматически инкапсулировать поля таким образом, если вы, по крайней мере, не контролируете двоичные файлы клиента и не можете использовать манипулирование байт-кодом. Если у вас есть такой уровень контроля, то да, cglib может быть вариантом. Однако даже при манипулировании байт-кодом невозможно перехватить java.lang.reflect.Field.set, поэтому вам нужно гарантировать, что ничто не изменяет поля с помощью отражения.

Ваш лучший вариант — сломать API и ввести сеттеры/геттеры. Это должно быть напоминанием всегда использовать правильную инкапсуляцию при создании API.

person Brett Kail    schedule 25.04.2010

AspectJ позволит вам сделать часть уведомления. Вы можете выполнить некоторое сплетение классов во время выполнения, а затем определить, когда кто-то изменяет переменную экземпляра или вызывает метод, а затем предпринимать любые действия, которые вы хотите.
Это не для робких !!!

Не знаете, что вы имеете в виду под изменением доступа без изменения кода?

person Romain Hippeau    schedule 25.04.2010