【问题标题】:AspectJ - Load-time weaving, privileged aspect and pointcut on private method of JRE classAspectJ - JRE 类的私有方法的加载时编织、特权方面和切入点
【发布时间】:2011-09-10 06:40:03
【问题描述】:

我正在尝试在私有方法 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)。

【问题讨论】:

    标签: java aop private aspectj


    【解决方案1】:

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

    【讨论】:

    • 我想在运行时编织,而不是在编译时。
    • 这告诉我特权方面和 LTW 不兼容,即使 AspectJ 文档没有明确说明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多