AspectJ: найти исходный код метода / имя найденной JoinPoint - PullRequest
0 голосов
/ 12 февраля 2020

Я хочу получить вызывающий метод, где вызывается указанный метод c.
Пример:
Метод, который я рассматриваю:

public void methodA(int a, int b){...}

вызывается в тестовом методе, а также в самой программе

@Test
public void testMethodA(
... some code...
objectClassA.methodA(x,y);
)}

Class B {
...
 public void methodB(){
    objectClassA.methodA(x,y);
   }
}

То, что я хочу получить как-то, внутренняя или, по крайней мере, подпись testMethodA и methodB

Чтобы сделать это, я подумал, что AspectJ может мне помочь, поэтому я посмотрел на это и закончил тем, что написал этот комментарий
pointcut pcmethodA(): execution(* A.methodA(..) );

и мой совет выглядел примерно так

before(): pcmethodA() {
        System.out.println("[AspectJ] Entering " + thisJoinPoint);
        System.out.println("[AspectJ] Signature " + thisJoinPoint.getSignature());
        System.out.println("[AspectJ] SourceLocation "+ thisJoinPoint.getSourceLocation());

Но это возвращает

[AspectJ] Entering execution(void com.example.somePackage.A.methodA(int, int)
[AspectJ] Signature com.example.somePackage.A.methodA(int, int)
[AspectJ] SourceLocation A.java:25   /** Line number of the methodA in the file **/

Я впервые использую AspectJ, есть ли любой объект или способ получить вызывающий метод из моих найденных точек соединения? testMethodA и methodB

Спасибо

1 Ответ

1 голос
/ 13 февраля 2020

Позвольте мне сначала воссоздать вашу ситуацию с несколькими примерами классов + приложением драйвера:

package de.scrum_master.app;

public class Foo {
  public void methodA(int a, int b) {
    System.out.println("methodA: " + a + ", " + b);
  }
}
package de.scrum_master.app;

public class DummyTest {
  public void testSomething() {
    new Foo().methodA(33, 44);
  }
}
package de.scrum_master.app;

public class Application {
  public void doSomething() {
    new Foo().methodA(11, 22);
  }

  public static void main(String[] args) {
    new Application().doSomething();
    new DummyTest().testSomething();
  }
}

Теперь попробуйте call() в сочетании с thisEnclosingJoinPointStaticPart в вашем аспекте:

package de.scrum_master.aspect;

import de.scrum_master.app.Foo;

public aspect MyAspect {
  pointcut pcmethodA() : call(* Foo.methodA(..));

  before() : pcmethodA() {
    System.out.println("[AspectJ] Executing: " + thisJoinPoint);
    System.out.println("[AspectJ] Called by: " + thisEnclosingJoinPointStaticPart);
  }
}

Журнал консоли при запуске Application:

[AspectJ] Executing: call(void de.scrum_master.app.Foo.methodA(int, int))
[AspectJ] Called by: execution(void de.scrum_master.app.Application.doSomething())
methodA: 11, 22
[AspectJ] Executing: call(void de.scrum_master.app.Foo.methodA(int, int))
[AspectJ] Called by: execution(void de.scrum_master.app.DummyTest.testSomething())
methodA: 33, 44

Видите? Нет необходимости манипулировать трассировкой стека, если вы просто хотите определить вызывающего и вызываемого абонентов.

...