AspectJ:查找找到的 JoinPoint 的源方法 code/name
AspectJ : Find the source method code/name of a found JoinPoint
我想检索调用特定方法的调用方法。
示例:
我考虑的方法:
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());
但是这个returns
[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
谢谢
让我先用几个示例重现您的情况 类 + 驱动程序应用程序:
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
看到了吗?如果您只想确定调用者和被调用者,则无需处理堆栈跟踪。
我想检索调用特定方法的调用方法。
示例:
我考虑的方法:
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());
但是这个returns
[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
谢谢
让我先用几个示例重现您的情况 类 + 驱动程序应用程序:
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
看到了吗?如果您只想确定调用者和被调用者,则无需处理堆栈跟踪。