Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Написание EventListener, Для не awt/swing класса 
:(
    Опции темы
3,14
  Дата 16.1.2006, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 6
Всего: 24



Задача такая:

Есть набор довольно больших классов; нужно написать для них EventListner чтоб можно было трекать какие ф-ии вызываются и кто какие переменные изменяет. Как это сделать с минимальными изменениями в самих классах?


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
LSD
Дата 16.1.2006, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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.
PM MAIL WWW   Вверх
3,14
Дата 16.1.2006, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 6
Всего: 24



Я хотел просто пронаследовать класс и перегрузить ф-ии добавив в них вывод debug инф-ии (так исходный класс вообще бы не задевался, да и работы не много), примерно так, пусть протрейсить бы нам нужно было класс Test:

Код

public class Test
{
    protected Object o;
    
    public void a()
    {
        b();
    }

    public void b()
    {
    }

    public Test()
    {
        o = null;
    }

    public Test(Object o)
    {
        this.o = o;
    }
    
    public static void main(String[] args)
    {
        new Test().a();
    }
}


создадим для него некий debug класс TestDebugger:

Код

public class TestDebugger extends Test
{
    public TestDebugger()
    {
        super();
        System.out.println("Constructor [1]!!!!!!!!");
    }

    public TestDebugger(Object o)
    {
        super(o);
        System.out.println("Constructor [2]!!!!!!!!");
        System.out.println("Object: " + o.toString() + "!!!!!!!!");
    }

    public void a()
    {
        super.a();
        System.out.println("The method [a] was called");
    }

    public void b()
    {
        super.a();
        System.out.println("The method [b] was called");
    }
}


Проблемма заключается в том, как заменить класс Test на его потомка (замена вызова всех конструторов не подходит)? Вот эту проблему я пока не знаю как решить smile


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
Stampede
Дата 16.1.2006, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 24
Всего: 144



Цитата(3 @ 14, 16.1.2006, 16:24 Найти цитируемый пост)

Есть набор довольно больших классов; нужно написать для них EventListner чтоб можно было трекать какие ф-ии вызываются и кто какие переменные изменяет. Как это сделать с минимальными изменениями в самих классах?


3,14, то, что ты пытаешься сделать - есть классическая задача аспект-ориентированного программирования (AOP), то есть реализация функциональности, которая затрагивает некоторый аспект, но идет поперек основной классовой иерархии. Один из механизмов, которым активно пользуются при решении AOP-ных задач - это механизм интерсепторов. А одна из возможных реализаций этого механизма - на базе динамических проксей. О там, как написать динамическую проксю писал, например, maximb в своей статье для ФАКа под названием Java Reflection.

Речь тут идет о том, что в Java существует механизм, позволяющий все вызовы методов осуществлять через один унифицированный метод invoke(Object proxy, Method method, Object[] args). Благодаря наличию такого механизма ты можешь написать свою реализацию этого метода, и в нем, прежде чем вызвывать собственно метод проксируемого объекта, делать все что угодно и как угодно. Например, в твоем случае - сохранять для потомства информацию о том, кто, когда и чего вызывал.

Одно маленькое замечание. Как ни блестяще выглядит данная идея, но у нее есть серьезное ограничение: перехватывать таким образом можно только методы, объявленные в каком-нибудь интерфейсе. Поэтому посмотри, получится ли у тебя вынести все интересующие тебя методы в отдельный интерфейс. Если получится - считай, что повезло. Если нет - тогда придется копать в сторону модификации байт-кода и библиотечки cglib, что, в общем, тоже решаемо, но несколько более геморройно. Но, повторяю, принципиально решаемо.

Удачи!

PM WWW   Вверх
3,14
Дата 17.1.2006, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 6
Всего: 24



Stampede, с перегрузкой метода invoke - просто супер, то что доктор прописал, но в остальном не подходит тем что не реально заменять вызов конструкторов классов во всех местах (проект > 100mb исходников) на вызов прокси smile
Добавлено @ 13:34
Вот если б при build-е проекта можно было бы ClassLoader подменить, это бы решило проблему.

Это сообщение отредактировал(а) 3,14 - 17.1.2006, 13:35


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0489 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.