1

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

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

只有当我在我试图编织的类中覆盖 toString 时它才有效,有没有办法让它适用于所有 toString 方法?

4

1 回答 1

4

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

编辑:我看了看,cflow 也不起作用。如果没有加载时编织,我看不到另一种方法,但这需要记录对 toString() 的所有调用,这是一个非常糟糕的主意。您可能最好在所有方法中使用return super.toString()简单地声明 toString() ,这样您的原始切入点就可以工作(如果永远不会调用 toString() ,否则您不会丢失任何东西)。

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

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


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

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

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

于 2009-07-19T20:15:57.550 回答