如何调用方法而不重复java

时间:2015-07-06 06:42:08

标签: java methods junit

例如,我有数以千计的方法:

AA() {
    ...
}  
BB() {
    ...
}  
CC() {
    ...
}  
etc ...

现在我想在每个方法的开头调用一个方法printCurrentMethodName()。这意味着,

AA() {
    printCurrentMethodName();
    ...
}  
BB() {
    printCurrentMethodName();
    ...
}  
CC() {
    printCurrentMethodName();
    ...
}  
etc ...

包括printCurrentMethodName()在数千个方法的开始是耗时的。

有没有什么方法可以在每个方法的开头调用printCurrentMethodName()而不用在那些数千个方法中重复它?

(我不能使用@Before或@BeforeMethod注释之类的东西,因为它会在输入AA()之前调用printCurrentMethodName(),因此它不会按预期打印方法名称。

5 个答案:

答案 0 :(得分:3)

如果您只想打印测试方法的名称,那么您可以创建一个类似于JUnit rule

TestName rule
public class PrintTestName extends TestWatcher {
  @Override
  protected void starting(Description d) {
      System.out.println(d.getMethodName());
  }
}

并在测试中使用它

public class YourTest {
  @Rule
  public final PrintTestName printTestName = new PrintTestName();

  @Test
  public AA() {
    ...
  }

  ...

答案 1 :(得分:2)

您可以将java.lang.reflect.InvocationHandler用于此目的。

在调用类中的任何方法之前(AABBCC等),调用invoke的{​​{1}}方法。在InvocationHandler方法中,您可以访问被调用的实际方法,并且可以在调用实际方法之前或之后添加其他逻辑,例如打印被调用方法的名称。

代码示例:

invoke

答案 2 :(得分:1)

您可以使用正则表达式在每个函数上插入此调用。

(\w+\(\w*\)\s*\{)替换为$1\nprintCurrentMethodName();

答案 3 :(得分:0)

如何使用AspectJ注释。

前 -

常见的AspectJ注释: 1. @ Before - 在方法执行之前运行

2. @ After - 在方法返回结果后运行

3. @ AfterReturning - 在方法返回结果后运行,也拦截返回的结果。

4. @ AfterThrowing - 在方法抛出异常后运行

5. @ Around - 绕过方法执行,结合上面的所有三个建议。

这可以解决您的问题。 您可以使用它在返回方法时调用方法

您可以关注this教程。

答案 4 :(得分:-1)

很简单,把这一行放在你的方法中。

System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName());