Java AspectJ:跟踪新对象初始化

Java AspectJ:跟踪新对象初始化,java,object,initialization,aspectj,Java,Object,Initialization,Aspectj,我试图理解AspectJ。我想尝试计算一个项目中的所有对象初始化(从我指定的类初始化,而不是一些Java内部类),但我真的不知道如何做到这一点 假设我有一个叫做A和B的类,其中A有子类Aa和Ab,B有子类Ba和Bb,Bb有子类Bba。我希望我的方面能够跟踪以这些类为基础创建的对象的每一次初始化,但我并不真正理解如何正确地做到这一点(尽管这应该有点简单)。到目前为止,我有类似的想法: public aspect AspectCounter { private int objects

我试图理解AspectJ。我想尝试计算一个项目中的所有对象初始化(从我指定的类初始化,而不是一些Java内部类),但我真的不知道如何做到这一点

假设我有一个叫做A和B的类,其中A有子类Aa和Ab,B有子类Ba和Bb,Bb有子类Bba。我希望我的方面能够跟踪以这些类为基础创建的对象的每一次初始化,但我并不真正理解如何正确地做到这一点(尽管这应该有点简单)。到目前为止,我有类似的想法:

public aspect AspectCounter {
        private int objects = 0;

        pointcut countObjects() : initialization(A.new(..)) || initialization(B.new(..));

        pointcut printObjects() : call(* Test.printCounter(..));

        after() : countObjects() {
            objects++;
        }

        after() : printObjects() {
            System.out.println(objects);
        }
}
它至少可以打印出我创建的正确数量的A和B(我没有使用B*.new(..),因为据我所知,它会跟踪Bba的任何初始化三次,我在本例中不希望这样)。
它现在的工作方式是,我有一个测试类,它做测试,在我完成测试之后,我只调用一个空的printCounter方法,它实际上什么都不做。它看起来很有效,而且确实为我提供了正确数量的对象,但我相信有更好的方法可以做到这一点。我真的不喜欢有一个空的方法。

你不能用
初始化
预初始化
执行
*上的切入点来实现这一点。新(…)
是因为它们的执行顺序。它们并不像您想象的那样嵌套,而是按照JVM的工作方式顺序执行。我已经详细解释了这一点,包括示例代码和日志输出。因此,您只能选择使用
调用
切入点。以下是一个例子:

package de.scrum\u master.app;
公共A类{}
package de.scrum\u master.app;
公共类Aa扩展了{}
package de.scrum\u master.app;
公共类Ab扩展了{}
package de.scrum\u master.app;
公共类B{}
package de.scrum\u master.app;
公共类Ba扩展了B{}
package de.scrum\u master.app;
公共类Bb扩展了B{}
package de.scrum\u master.app;
公共类Bba扩展了Bb{}
驱动程序应用程序:

package de.scrum\u master.app;
公共类应用程序{
公共静态void main(字符串[]args){
新A();
新Aa();
新Ab();
新B();
新Ba();
新Bb();
新Bba();
}
}
方面:

package de.scrum\u master.aspect;
导入de.scrum_master.app.A;
导入de.scrum_master.app.B;
公共方面InstanceCreationCounter{
私有静态整数计数;
after():调用(A+.new(..)| |调用(B+.new(..){
System.out.printf(“%4d%s%n”++计数,thisJoinPoint);
}
}
控制台日志:

1调用(de.scrum\u master.app.A())
2调用(de.scrum\u master.app.Aa())
3调用(de.scrum\u master.app.Ab())
4调用(de.scrum\u master.app.B())
5调用(de.scrum\u master.app.Ba())
6调用(de.scrum\u master.app.Bb())
7调用(de.scrum\u master.app.Bba())
我想这就是你想要的

注意事项:您需要控制所有调用代码,并将方面编织到其中,以使其正常工作