Изменить доступ к полю для доступа к методу получения / установки - PullRequest
2 голосов
/ 26 апреля 2010

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

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

Приветствия и заранее спасибо, Chris

Ответы [ 2 ]

1 голос
/ 26 апреля 2010

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

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

0 голосов
/ 26 апреля 2010

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

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

...