AspectJ与toString()

时间:2009-07-19 19:51:50

标签: java aop override tostring aspectj


public pointcut myToString() : within(mypackage.*) 
&& execution(public String toString());

String around(): myToString(){
    System.out.println("myToString");
    return proceed();
}

只有在我尝试编织的类Im中覆盖toString时才有效,是否有任何方法可以使其适用于所有toString方法?

1 个答案:

答案 0 :(得分:4)

它不起作用,因为within()只匹配包中的执行,但是你继承了toString()方法,除非你明确声明它。

编辑:我看了一下,cflow也无法正常工作。在没有加载时编织的情况下,我无法看到另一种方法,但这需要记录对toString()的所有调用,这是一个非常糟糕的主意。 使用 return super.toString()在所有方法中声明toString()可能会好得多,所以你的原始切入点会起作用(如果toString()从不被调用,否则你不会失去任何东西)。

如果您决定采用这种方法,aspectj documentation的一部分将帮助您开始加载时编织。

更新:另一个选择是使用Eclipse的Detail Formatters。它们允许您装饰toString()方法以进行调试。


原始答案: 您可以尝试使用 cflow 来匹配toString()控制流中的任何连接点。注意我无法验证这一点,因此请检查语法(它可能还需要执行()而不是call(),尽管我无法回想起来。 例如:

public pointcut myToString() : cflow(call(String mypackage.*.toString()));

另一点,请注意添加System.out调用,请考虑使用日志框架。