AspectJ - Плетение во время загрузки, привилегированный аспект и pointcut для закрытого метода класса JRE - PullRequest
0 голосов
/ 07 июня 2011

Я пытаюсь установить pointcut для частного метода java.net.AbstractSocketImpl.connectToAddress (..) и хочу использовать ткачество во время загрузки. Это мой тестовый код:

public class Main {
    public static void main(String args[]) throws Throwable {
        new java.net.Socket("localhost", 10111);
    }
}

и это мой привилегированный аспект:

privileged aspect PrivAspect {
    before() : call(* java.net.AbstractPlainSocketImpl.connectToAddress(..)) {
        System.out.println("It works");
    }
}

а это META-INF / aop.xml

<aspectj>
  <aspects>
    <aspect name="PrivAspect"/>
  </aspects>
  <weaver options="-verbose -Xset:weaveJavaPackages=true"/>
</aspectj>

Вот как я компилирую код:

$ javac Main.java
$ java -jar ../lib/aspectjtools-1.6.11.jar -source 6 -cp .:$CLASSPATH PrivAspect.aj
[warning] this affected type is not exposed to the weaver: java.net.AbstractPlainSocketImpl (needed for privileged access) [Xlint:typeNotExposedToWeaver]

/home/batto/work/ajtest/test/PrivAspect.aj:2 [warning] advice defined in PrivAspect has not been applied [Xlint:adviceDidNotMatch]


2 warnings
$ java -cp .:$CLASSPATH -javaagent:../lib/aspectjweaver-1.6.11.jar Main

В последней строке выдается ожидаемое исключение «отказано в соединении» (порт закрыт), но рекомендация не вызывается.

В чем проблема?

Спасибо.

РЕДАКТИРОВАТЬ: я знаю, что java.net.AbstractPlainSocketImpl.connectToAddress (..) вызывается (я отладил Main в Eclipse).

1 Ответ

0 голосов
/ 08 июня 2011

Это похоже на ткачество после компиляции со ссылкой на класс, не указанный в пути (java.net.AbstractPlainSocketImpl)Необходимо явно указать, какие файлы .class / .jar должны быть «сплетены» AspectJ.Подробности здесь: http://www.eclipse.org/aspectj/doc/released/devguide/ajc-ref.html

...