Получить значения параметров метода, используя AspectJ - PullRequest
7 голосов
/ 21 ноября 2011

Я использую AspectJ для захвата вызовов методов. Затем мне нужно получить имя метода и значения параметров. Давайте рассмотрим следующий пример:

Line2D line = new Line2D.Double(lineStart, lineEnd);
and graphics.draw(line);

Мне нужно перехватить все звонки на Graphics2D.draw(Shape). У меня есть pointcut, который делает это:

pointcut captureCallParameters(Shape name) : call(* *(Shape)) && args(name);

Проблема в том, что я пытаюсь получить значение параметра (Shape в этом методе). Я получаю этот параметр: java.awt.geom.Line2D$Double@596e1fb1

Instad Я хочу получить точки для фигуры, которая в этом случае является линией.

С другой стороны, у меня также есть pointcut, который соответствует конструкции новой линии, упомянутой выше, и я могу получить параметры этой линии. НО я не знаю, как связать метод Draw с этим конструктором линии. У меня может быть несколько конструкторов для Line s, и я не знаю, какой из этих Line s нарисован методом Draw(line).

1 Ответ

6 голосов
/ 22 ноября 2011

Вы абсолютно правы!

Вы действительно поймали экземпляр 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 ().

...