【问题标题】:How to capture the parameters of System.out.println() in AspectJ's aspect and display in pointcut?如何在 AspectJ 的切面中捕获 System.out.println() 的参数并在切入点中显示?
【发布时间】:2014-03-08 14:09:20
【问题描述】:

我对 AspectJ 很陌生……刚开始学习。 到目前为止,我能够在我的方面获取用户定义方法的参数并在我的切入点中打印捕获的参数。 奇怪的是,我开始考虑在我的切入点的建议中打印System.out.println() 的内容并编写了以下简单代码:

HelloClass.java:

public class HelloClass
{
    public static void main(String a[])
    {
        System.out.println("hello sachin");
    }
}

HelloAspect.java:

public aspect HelloAspect
{
   pointcut callPointcut(String message ) :call(void java.lang.System.out.println(String))&& args(message);

   before( String message) : callPointcut(message )
   {
      System.out.println("Fetced in  point cut:"+message);
      //System.out.println("In the advice attached to the call pointcut");
   }
}

然后我使用ajc HelloClass.java HelloAspect.java 编译了这两个文件 编译成功,一穿如下: 当我使用java HelloClass 运行程序时 它输出为:Hello sachin,它应该是Fetced in point cut:Hello sachin

所以任何人都可以指出我哪里出错或遗漏了什么。 。先感谢您 。 .

【问题讨论】:

    标签: java aop aspectj


    【解决方案1】:

    我仍然感到震惊.. 发布后 2 天,没有人回答我的这个问题......但是很好,我找到了解决方案并意识到我错了。这是我在 println method() 签名中的错误。

    这是 println 的正确签名:

     void around(String str) : 
        call(void java.io.PrintStream.println(String)) && args(str)
    

    对我来说效果很好。 .

    【讨论】:

      【解决方案2】:

      从 JRE 中捕获方法调用并不容易。

      当你尝试捕捉自己的方法时更容易学习aspectj。 可能在 HelloClass 中定义您自己的 println 方法,然后重试。

      要使用 aspectj 和 jre 类,您需要使用 aspectj 编译器重新编译 jre 类。

      http://dev.eclipse.org/mhonarc/lists/aspectj-users/msg09350.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多