我正在使用AspectJ来捕获方法调用。然后我需要获取方法名称和传递的参数值。 我们有以下示例:
Line2D line = new Line2D.Double(lineStart, lineEnd);
and graphics.draw(line);
我需要捕获对Graphics2D.draw(Shape)
的所有来电。我有一个切入点可以做到这一点:
pointcut captureCallParameters(Shape name) : call(* *(Shape)) && args(name);
问题是我试图获取参数的值(此方法中的Shape)。我得到这个参数:java.awt.geom.Line2D$Double@596e1fb1
Instad我想获得形状的点,在这种情况下是一条线。
另一方面,我还有一个切入点与上面提到的新线的构造相匹配,我能够获得该线的参数。但我不知道如何将Draw方法与该行构造函数联系起来。我可以为Line
设置几个构造函数,我不知道使用Line
方法绘制了哪个Draw(line)
。
答案 0 :(得分:6)
你完全正确!
您确实已经捕获了您正在寻找的Line2D实例。但是,您似乎在shape
语句中打印出System.out.println(shape)
变量。你在那里java.awt.geom.Line2D$Double@596e1fb1
是变量的标识符。您现在可以通过调用任何可用方法(例如shape.getBounds()
)来访问变量的内容。
此外,您可以执行以下操作:
Line2D line = (Line2D) shape; // cast it to Line2D
line.getX1(); // will give you X1 of your line
line.getX2(); // will give you X2 of your line
最后一点,这是针对您的用例的更好的切入点定义:
pointcut captureCallParameters(Shape shape) : call(* Graphics2D.draw(..)) && args(shape);
在切入点中,您将拦截具有Shape参数的所有方法调用。在我的版本中,您将只捕获draw()方法的调用。