在Java中调用方法之前和之后运行方法

时间:2012-03-07 06:49:58

标签: java reflection annotations

我正在尝试编写一个Java程序,这样在调用 methodA()之后,首先调用一个名为 methodBeforeA()的方法然后 methodA执行(),然后执行另一个名为 methodAfterA()的方法。这与Junit使用Annotations(使用@ Before,@ Test,@ After)非常相似,所以我认为应该可以使用反射,但我没有很好的线索。

2 个答案:

答案 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();
}

你当然可以这样做,以确保在每次调用相关方法后调用“之前”和“之后”方法。但是你不能强迫所有调用者也这样做。