![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Stampede |
|
||||||
![]() Гносеолог ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 963 Регистрация: 25.4.2005 Где: Calgary, Alberta, Canada Репутация: 24 Всего: 144 |
Вот уже некоторое время ломаю голову, как можно было бы перехватывать вызовы в самом классе, без оборачивания его в динамический прокси. Чтобы было понятнее, о чем речь, приведу пример более или менее правдоподобной ситуации.
Допустим, у нас есть иерархи классов: абстрактный Pet и его конкретные реализации:
Допустим, я разрабатываю API общего пользования для онлайновых зоомагазинов, и я не знаю наперед, какие конкретные реализации будут у класса Pet. Мне для моих нужд достаточно просто знать, как зверек называется и какие звуки он издает. Очень хорошо. Теперь представим, что некто решил сделать свой тип многоязычным, и при инициализации лезет в какой-нибудь файл или базу данных, чтобы извлечь оттуда таблицу звуков. На такой случай я определяю контракт: дай своему загрузочному методу название, начинающееся на "load", и я предоставлю тебе дополнительный сервис. Например, буду засекать время начала и конца операции загрузки, и выводить это дело в лог. Так, чтобы он мог написать:
А теперь внимание, вопрос: как мне в классе Pet встроить перехватчик, чтобы он перехватывал все без исключения вызовы (включая методы, объявленные в дочерних классах), и в случае если метод начинается на load, оформлял бы его вызов примерно таким образом:
Если воспользоваться механизмом динамических прокси, то это делается в два счета. Но тогда объекты у нас будут уже не оригинальные Pets, а нечто другое. А хотелось бы, чтобы были именно оригинальные объекты - по множеству разных причин. Например, чтобы их можно было создавать обычным конструктором. Будут какие-нибудь предложения? Приветствуются любые идеи. |
||||||
|
|||||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 51 Всего: 118 |
Я как-то изучал AspectJ - так вот он похоже не генерит прокси, а обрабатывает нужные классы и делает в них вставки. Правда делает это он на этапе компиляции. Зайди сюда - http://www.eclipse.org/aspectj/
Хотя может я что-то не так понял - просматривал просто |
|||
|
||||
| Stampede |
|
|||
![]() Гносеолог ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 963 Регистрация: 25.4.2005 Где: Calgary, Alberta, Canada Репутация: 24 Всего: 144 |
Ага, буду смотреть. Меня в свое время смутило то, что у них был какой-то свой Java-подобный язык. Мож чего не понял
|
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 51 Всего: 118 |
Да, там есть такое. Он описывает те самые аспекты, которые потом буду вставляться в нужные места. Но там мне помню понравилось, что никто не мешает собирать без изменений без включения аспектов. |
|||
|
||||
![]()
|
| Правила форума "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. |