我正试图编写一个Java程序,以便在调用methodA()后,首先调用一个名为methodBeforeA()的方法,然后执行methodA(。这与Junit使用Annotations(使用@Before、@Test、@After)所做的非常相似,所以我认为使用反射应该是可能的,但我没有很好的线索。
AspectJ允许您在方法进入之前和方法退出之后指定切点。
http://www.eclipse.org/aspectj/doc/released/progguide/starting-aspectj.html
在AspectJ中,切入点挑选程序流中的某些连接点。例如,切入点
call(void Point.setX(int))
选取每个连接点,该连接点是对具有签名void
Point.setX(int)
的方法的调用,即Point
的具有单个int
参数的void setX
方法。
这需要修改方法代码以插入对其他方法的调用。Java反射允许您做很多事情,但它不允许您动态修改方法代码。
JUnit所做的是不同的。它识别了注释为@Before
、@Test
和@After
的每个方法,然后按照以下方式执行操作:
for (Method t : testMethods) {
for (Method b : beforeMethods)
b.invoke();
t.invoke();
for (Method a : afterMethods)
a.invoke();
}
您当然可以这样做,以确保每次调用有问题的方法后都调用"before"one_answers"after"方法。但您不能强迫所有调用方都这样做。