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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перехват вызовов методов без проксирования, в обычном POJO классе 
:(
    Опции темы
Stampede
Дата 29.9.2006, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


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

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



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

Допустим, у нас есть иерархи классов: абстрактный Pet и его конкретные реализации:

Код

ipublic abstract class Pet {
    public abstract String getType() {
    }

    public abstract String speak() {
    }
}

public class Dog extends Pet {
    public String getType() {
        return "dog";
    }

    public String speak() {
        return "Arf!";
    }
}

public class Cat extends Pet {
    public String getType() {
        return "cat";
    }

    public String speak() {
        return "Meou!";
    }
}


Допустим, я разрабатываю API общего пользования для онлайновых зоомагазинов, и я не знаю наперед, какие конкретные реализации будут у класса Pet. Мне для моих нужд достаточно просто знать, как зверек называется и какие звуки он издает. Очень хорошо.

Теперь представим, что некто решил сделать свой тип многоязычным, и при инициализации лезет в какой-нибудь файл или базу данных, чтобы извлечь оттуда таблицу звуков. На такой случай я определяю контракт: дай своему загрузочному методу название, начинающееся на "load", и я предоставлю тебе дополнительный сервис. Например, буду засекать время начала и конца операции загрузки, и выводить это дело в лог.

Так, чтобы он мог написать:

Код

ipublic class Frog extends Pet {
    private Map<Locale, String> soundMap;
    //....
    public String speak() {
        if (soundMap == null) {
            loadSounds();
        }
        return soundMap.get(Locale.getDefault());
    }

    private void loadSounds() {
        // Тут собственно загружается таблица
    }
}


А теперь внимание, вопрос: как мне в классе Pet встроить перехватчик, чтобы он перехватывал все без исключения вызовы (включая методы, объявленные в дочерних классах), и в случае если метод начинается на load, оформлял бы его вызов примерно таким образом:

Код

if (method.getName().startsWith("load")) {
    long t = System.currentTimeMillis();
    Object result = method.invoke(obj, args);
    logger.debug("Method " + method.getName() + " executed in " + (System.currentTimeMillis() - t));
    return result;
}


Если воспользоваться механизмом динамических прокси, то это делается в два счета. Но тогда объекты у нас будут уже не оригинальные Pets, а нечто другое. А хотелось бы, чтобы были именно оригинальные объекты - по множеству разных причин. Например, чтобы их можно было создавать обычным конструктором.

Будут какие-нибудь предложения? Приветствуются любые идеи.

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


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



Я как-то изучал AspectJ - так вот он похоже не генерит прокси, а обрабатывает нужные классы и делает в них вставки. Правда делает это он на этапе компиляции. Зайди сюда - http://www.eclipse.org/aspectj/
Хотя может я что-то не так понял - просматривал просто
PM MAIL WWW ICQ   Вверх
Stampede
Дата 30.9.2006, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


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

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



Ага, буду смотреть. Меня в свое время смутило то, что у них был какой-то свой Java-подобный язык. Мож чего не понял smile

PM WWW   Вверх
AntonSaburov
Дата 30.9.2006, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



Цитата(Stampede @  30.9.2006,  14:25 Найти цитируемый пост)
что у них был какой-то свой Java-подобный язык.

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

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

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


 




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


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

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