AspectJ - pointcut при вызове нативного метода

Можно ли установить pointcut при вызове собственного метода с помощью AspectJ? Я попробовал следующий аспект:

public aspect EmailAspect {
    pointcut conn() : call(* java.net.PlainSocketImpl.socketConnect(..));
    before() : conn() {
        System.out.println("Connecting");
    }
}

Но это не работает. Я также не нашел много соответствующей информации в гугле (кроме этого http://blog.jayway.com/2007/02/16/static-mock-using-aspectj, однако неясно, возможно ли это и как это сделать).

Я попытался отладить свой тестовый код (который подключается только к некоторому локальному порту TCP) в Eclipse, и eclipse остановился в точке останова socketConnect().

Спасибо.

ОБНОВЛЕНИЕ

Это, вероятно, причина:

AspectJ - переплетение во время загрузки, привилегированное аспект и точка в закрытом методе класса JRE


person batto    schedule 07.06.2011    source источник


Ответы (2)


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

person Atreys    schedule 07.06.2011
comment
Извините, я забыл упомянуть, что я не хочу использовать переплетение исходного кода, потому что я не хочу включать весь JDK в свой скомпилированный код (я использую переплетение во время загрузки). Я думаю, проблема в том, что socketConnect() является частным пакетом, а аспект не является привилегированным. - person batto; 07.06.2011
comment
@batto Звучит как вероятный виновник. Извините, у меня достаточно теории аспектов, но нет практического опыта. - person Atreys; 07.06.2011

Если это сообщение электронной почты соответствует действительности, после объявления метода native, Java будет писать байт-код, который переходит непосредственно к базовому машинному коду C++/C. Это означает, что AspectJ нечего перехватывать, независимо от того, происходит ли это во время компиляции, во время посткомпиляции или во время загрузки.

person Nick    schedule 07.06.2011
comment
Это действительно похоже на правду. Я проверил это на себе. Аспект, предложенный в электронном письме, работал для меня. - person Michal Vician; 31.05.2012