Наткнулся на интересную штуку.
Повадились пилить собственные узлы тарифных деревьев для модуля Phone:
пакеты трафика, фильтры по карте зон для А-номера и т.п.
Решили, мол, зачем мы будем делать все в jar-ках. Давайте добавим в phone.xml узел "Обработчик" из Inet и будем писать все новые узлы через дин код.
Написали узел, проверяющий по карте зон, что A и B - номера находятся в одной зоне (позволит собрать один универсальный тариф на местную связь для разных городов).
Проверили - работает.
Потом решил заодно установить направление в этом же узле:
Код:
if (zdrFrom.zoneId > 0 && zdrFrom.zoneId == zdrTo.zoneId) {
//Добавляем установку направления, если заходим в узел
if (zdrTo.destId > 0)
{
req.dest = zdrTo.destId;
}
if(logger.isDebugEnabled()) {
logger.debug("Номера в одной зоне");
}
return 1;
}
- процессы-обработчики молча умирают на строчке
Код:
req.dest = zdrTo.destId;
Происходит так, судя по всему, от того, что поле dest - protected.
И несмотря на то, что наш класс в динкоде находится в том же package, что и AbstractPhoneTariffRequest, он не считает их "соседними", т.к. они в JVM грузятся разными classloader-ами.
Вот и гугл выдал:
http://stackoverflow.com/questions/1046 ... ferent-jar(там в названии написано про different jar, но в тексте говорится, что ещё и classloader-ы разные).
Такие пироги.
Полезно знать, что новым узлом "обработчик" можно писать только простые узлы-фильтры, не меняющие TariffRequest.
Либо, как мне тут подсказывают java-гуру, пользоваться рефлексией.