【问题标题】:Get method parameter values using AspectJ使用 AspectJ 获取方法参数值
【发布时间】:2012-01-02 18:43:59
【问题描述】:

我正在使用 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 方法与该行构造函数联系起来。我可以为Lines 提供多个构造函数,但我不知道使用Draw(line) 方法绘制的Lines 中的哪一个。

【问题讨论】:

    标签: methods parameters aspectj


    【解决方案1】:

    你完全正确!

    您确实已经捕获了您正在寻找的 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() 方法的调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多