【问题标题】:Run a method before and after a called method in Java在Java中调用方法之前和之后运行方法
【发布时间】:2012-03-07 06:49:58
【问题描述】:

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

【问题讨论】:

    标签: java reflection annotations


    【解决方案1】:

    AspectJ 允许您在方法进入之前和方法退出之后指定切点。

    http://www.eclipse.org/aspectj/doc/released/progguide/starting-aspectj.html

    在 AspectJ 中,切入点在程序流中挑选出某些连接点。比如切入点

    call(void Point.setX(int))
    

    挑选出每个调用具有签名 void Point.setX(int) 的方法的连接点,即带有单个 int 参数的 Point 的 void setX 方法。

    【讨论】:

    【解决方案2】:

    这需要修改方法代码以插入对其他方法的调用。 Java 反射可以让你做很多事情,但它不允许你动态修改方法代码。

    JUnit 所做的是不同的。它识别每个注解为@Before、@Test 和@After 的方法,然后执行以下操作:

    for (Method t : testMethods) {
        for (Method b : beforeMethods)
            b.invoke();
        t.invoke();
        for (Method a : afterMethods)
            a.invoke();
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      相关资源
      最近更新 更多