2010-04-25 6 views
2

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

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

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

+0

Похоже, что это не вариант изменения самого javabean-кода. Это правда? Иначе было бы намного проще. – BalusC

+0

Ну, ничего, правда. Все, что я хочу, это сказать, что у вас есть объект «k» с полем «p», и пользователь обращается к нему через k.p = 5 или что-то в этом роде. Его следует заменить на k.setP (5). Плагины преобразования кода для Eclipse для этого также приветствуются, но, как вы знаете, использование многих геттеров/сеттеров в ограниченном пространстве может сделать код очень грязным. –

+0

Просто введите свойства 'private'? Извините, но сейчас я совершенно не понимаю смысла. – BalusC

ответ

1

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

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

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^