![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| 3,14 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1614 Регистрация: 18.6.2004 Где: Н. Новгород Репутация: 6 Всего: 24 |
Задача такая:
Есть набор довольно больших классов; нужно написать для них EventListner чтоб можно было трекать какие ф-ии вызываются и кто какие переменные изменяет. Как это сделать с минимальными изменениями в самих классах? -------------------- Может быть, это только мой бред, Может быть, жизнь не так хороша, Может быть, я не выйду на свет, Но я летал, когда пела душа... |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Если тебя интересует модель, то тут самое то будет PropertyChangeListener (немного даработанный). Достаточно будет добавить два метода для регистрации/разрегистрации слушателя и один для оповещения слушателей, и плюс в каждом методе вызывать firePropertyChanged().
А если тебя интересует, как это добавить все эти вызовы в методы в классы, с минимальным приложением приложением сил, то не знаю. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| 3,14 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1614 Регистрация: 18.6.2004 Где: Н. Новгород Репутация: 6 Всего: 24 |
Я хотел просто пронаследовать класс и перегрузить ф-ии добавив в них вывод debug инф-ии (так исходный класс вообще бы не задевался, да и работы не много), примерно так, пусть протрейсить бы нам нужно было класс Test:
создадим для него некий debug класс TestDebugger:
Проблемма заключается в том, как заменить класс Test на его потомка (замена вызова всех конструторов не подходит)? Вот эту проблему я пока не знаю как решить -------------------- Может быть, это только мой бред, Может быть, жизнь не так хороша, Может быть, я не выйду на свет, Но я летал, когда пела душа... |
||||
|
|||||
| Stampede |
|
|||
![]() Гносеолог ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 963 Регистрация: 25.4.2005 Где: Calgary, Alberta, Canada Репутация: 24 Всего: 144 |
3,14, то, что ты пытаешься сделать - есть классическая задача аспект-ориентированного программирования (AOP), то есть реализация функциональности, которая затрагивает некоторый аспект, но идет поперек основной классовой иерархии. Один из механизмов, которым активно пользуются при решении AOP-ных задач - это механизм интерсепторов. А одна из возможных реализаций этого механизма - на базе динамических проксей. О там, как написать динамическую проксю писал, например, maximb в своей статье для ФАКа под названием Java Reflection. Речь тут идет о том, что в Java существует механизм, позволяющий все вызовы методов осуществлять через один унифицированный метод invoke(Object proxy, Method method, Object[] args). Благодаря наличию такого механизма ты можешь написать свою реализацию этого метода, и в нем, прежде чем вызвывать собственно метод проксируемого объекта, делать все что угодно и как угодно. Например, в твоем случае - сохранять для потомства информацию о том, кто, когда и чего вызывал. Одно маленькое замечание. Как ни блестяще выглядит данная идея, но у нее есть серьезное ограничение: перехватывать таким образом можно только методы, объявленные в каком-нибудь интерфейсе. Поэтому посмотри, получится ли у тебя вынести все интересующие тебя методы в отдельный интерфейс. Если получится - считай, что повезло. Если нет - тогда придется копать в сторону модификации байт-кода и библиотечки cglib, что, в общем, тоже решаемо, но несколько более геморройно. Но, повторяю, принципиально решаемо. Удачи! |
|||
|
||||
| 3,14 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1614 Регистрация: 18.6.2004 Где: Н. Новгород Репутация: 6 Всего: 24 |
Stampede, с перегрузкой метода invoke - просто супер, то что доктор прописал, но в остальном не подходит тем что не реально заменять вызов конструкторов классов во всех местах (проект > 100mb исходников) на вызов прокси
Добавлено @ 13:34 Вот если б при build-е проекта можно было бы ClassLoader подменить, это бы решило проблему. Это сообщение отредактировал(а) 3,14 - 17.1.2006, 13:35 -------------------- Может быть, это только мой бред, Может быть, жизнь не так хороша, Может быть, я не выйду на свет, Но я летал, когда пела душа... |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |