Java AspectJ与toString()

Java AspectJ与toString(),java,aop,overriding,tostring,aspectj,Java,Aop,Overriding,Tostring,Aspectj,只有在我试图编织的类中重写toString时,它才能工作,有没有办法让它在所有toString方法上工作?它不会工作,因为within()只匹配包中的执行,但除非显式声明,否则您将继承toString()方法 编辑:我看了一下,cflow也不起作用。在没有加载时编织的情况下,我看不到其他方法来实现这一点,但这需要记录对toString()的所有调用,这是一个非常糟糕的想法。 使用return super.toString()在所有方法中简单地声明toString()可能会更好,这样原始切入点就可

只有在我试图编织的类中重写toString时,它才能工作,有没有办法让它在所有toString方法上工作?

它不会工作,因为within()只匹配包中的执行,但除非显式声明,否则您将继承toString()方法

编辑:我看了一下,cflow也不起作用。在没有加载时编织的情况下,我看不到其他方法来实现这一点,但这需要记录对toString()的所有调用,这是一个非常糟糕的想法。 使用return super.toString()在所有方法中简单地声明toString()可能会更好,这样原始切入点就可以工作了(如果从未调用过toString(),否则就不会丢失任何东西)

若您决心采用这种方法,那个么其中有一部分将帮助您开始加载时编织

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


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


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

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

另一点,小心添加Syt.OutLoad,考虑使用日志记录框架。

它将不起作用,因为(只有)匹配在包中执行,但除非继承了它,否则您将继承toStutin()方法。

编辑:我看了一下,cflow也不起作用。在没有加载时编织的情况下,我看不到其他方法来实现这一点,但这需要记录对toString()的所有调用,这是一个非常糟糕的想法。 使用return super.toString()在所有方法中简单地声明toString()可能会更好,这样原始切入点就可以工作了(如果从未调用过toString(),否则就不会丢失任何东西)

若您决心采用这种方法,那个么其中有一部分将帮助您开始加载时编织

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


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


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

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

另一点,注意添加Syt.OutLoad,考虑使用日志记录框架。

也许你应该尝试编织对象.toStReg(),它与每一个TestScript()相匹配,这还没有被重写,也许你应该尝试编织对象。toStGrand(),它与每个ToStRung()相匹配,这不是为了帮助我,如何使用编译时编织?这可能是一个坏主意,但我将使用它进行测试,所以它不会造成太大的伤害。很抱歉,它应该是加载时编织,更新并添加了一个参考。thx试图帮助我,如何使用编译时编织?这可能是个坏主意,但我将使用它进行测试,所以它不会造成太大的伤害。很抱歉,它应该是加载时编织、更新和添加了引用。