我正在尝试编写一个Java程序,这样在调用 methodA()之后,首先调用一个名为 methodBeforeA()的方法然后 methodA执行(),然后执行另一个名为 methodAfterA()的方法。这与Junit使用Annotations(使用@ Before,@ Test,@ After)非常相似,所以我认为应该可以使用反射,但我没有很好的线索。
答案 0 :(得分:5)
AspectJ允许您在方法输入之前和方法退出之后指定切割点。
http://www.eclipse.org/aspectj/doc/released/progguide/starting-aspectj.html
在AspectJ中,切入点选择程序流中的某些连接点。例如,切入点
call(void Point.setX(int))
选出每个连接点,该连接点是对具有签名void
Point.setX(int)
的方法的调用 - 即Point
的{{1}}方法,只有一个void setX
参数。
答案 1 :(得分:3)
这需要修改方法代码以插入对其他方法的调用。 Java反射可以让你做很多事情,但它不允许你动态修改方法代码。
JUnit的作用与众不同。它标识了每个注释为@Before
,@Test
和@After
的方法,然后执行以下操作:
for (Method t : testMethods) {
for (Method b : beforeMethods)
b.invoke();
t.invoke();
for (Method a : afterMethods)
a.invoke();
}
你当然可以这样做,以确保在每次你调用相关方法后调用“之前”和“之后”方法。但是你不能强迫所有调用者也这样做。