Methods 使用AspectJ获取方法参数值

Methods 使用AspectJ获取方法参数值,methods,parameters,aspectj,Methods,Parameters,Aspectj,我正在使用AspectJ捕获方法调用。然后我需要得到传递的方法名和参数值。 让我们举个例子: Line2D line = new Line2D.Double(lineStart, lineEnd); and graphics.draw(line); 我需要捕获对Graphics2D.draw(Shape)的所有调用。我有一个切入点可以做到这一点: pointcut captureCallParameters(Shape name) : call(* *(Shape)) && a

我正在使用AspectJ捕获方法调用。然后我需要得到传递的方法名和参数值。 让我们举个例子:

Line2D line = new Line2D.Double(lineStart, lineEnd);
and graphics.draw(line);
我需要捕获对
Graphics2D.draw(Shape)
的所有调用。我有一个切入点可以做到这一点:

pointcut captureCallParameters(Shape name) : call(* *(Shape)) && args(name);
问题是当我尝试获取参数值(此方法中的形状)时。我得到这个参数:
java.awt.geom.Line2D$Double@596e1fb1

安装我想得到的形状,这是一条线在这种情况下的点


另一方面,我还有一个切入点,它与上面提到的新行的构造相匹配,我能够得到该行的参数。但我不知道如何将Draw方法与line构造函数联系起来。对于
Line
s,我可以有几个构造函数,但我不知道使用
Draw(Line)
方法绘制的是哪一个
Line
s。

你完全正确

您确实已经捕获了正在查找的Line2D实例。但是,您似乎正在打印
System.out.println(shape)
语句中的
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()方法的调用