如何在AspectJ的方面捕获System.out.println()的参数并在切入点中显示?

时间:2014-03-08 14:09:21

标签: java aop aspectj

我是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编译了两个文件 它编译成功的一个方面如下: cmd 当我使用java HelloClass运行程序时 输出为:Hello sachin,其中应为Fetced in point cut:Hello sachin

所以任何人都可以指出我出错或丢失的地方。 。先感谢您 。

2 个答案:

答案 0 :(得分:3)

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

这是println的正确签名:

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

它对我来说很好。

答案 1 :(得分:0)

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

当你试图捕捉自己的方法时,

更容易学习aspectj。 也许在HelloClass中定义自己的println方法,然后再试一次。

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

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