AspectJ - JRE类的私有方法的加载时编织,特权方面和切入点

时间:2011-06-07 17:19:43

标签: java aop private aspectj

我正在尝试在私有方法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(..)(我在Eclipse中调试了Main)。

1 个答案:

答案 0 :(得分:0)

这看起来像编译时编织时引用了未在inpath(java.net.AbstractPlainSocketImpl)中指定的类。有必要明确指定哪些.class / .jar文件由AspectJ“编织”。在此处查看更多详细信息:http://www.eclipse.org/aspectj/doc/released/devguide/ajc-ref.html