首页 > 解决方案 > 隐式提取 Scala 函数名和参数

问题描述

我有以下代码:

def disableRules(someId: String) = Action.async { implicit req =>
   Metrics.measureTime("disableRules") {
     someFutureOpr(someId).map(_ => Ok)
     .recover {
       case e: Exception => handlerError(s"Failure occurred on disableRules request ${e.getMessage}", "disableRules")
     }
   }
 }

def activeRules(someId: String) = Action.async { implicit req =>
  Metrics.measureTime("activeRules") {
    someFutureOpr2(someId).map(_ => Ok)
    .recover {
      case e: Exception => handlerError(s"Failure occurred on activeRules request ${e.getMessage}", "activeRules")
    }
  }
}
...

正如你所看到的,我有mesureTimehandleError函数,我将函数的名称作为字符串传递给他们,有没有办法隐式地使它,我的意思是它会采用函数名称,如果没有 - 有办法提取函数名称和打印它,也关于参数。

标签: scalaplayframework

解决方案


里面计算Metrics

object Metrics {
  def currentMethodName() : String = Thread.currentThread.getStackTrace()(3).getMethodName

  def measureTime(): Unit = {
    println(currentMethodName)
  }
}

然后例如:

def a1() = {
  Metrics.measureTime()
}

def a2() = {
  Metrics.measureTime()
}

将输出:

a1
a2

这是一个安全的操作吗?

如果我们有:

def currentMethodName() : String = Thread.currentThread.getStackTrace.toList.mkString("\n")

我们得到:

java.lang.Thread.getStackTrace(Thread.java:1559)
HelloWorld1$Metrics$.currentMethodName(HelloWorld1.scala:69)
HelloWorld1$Metrics$.measureTime(HelloWorld1.scala:72)
HelloWorld1$.a1(HelloWorld1.scala:77)
HelloWorld1$.main(HelloWorld1.scala:103)
HelloWorld1.main(HelloWorld1.scala)

所以我们看到:

  • 在索引 0 中,我们得到getStackTrace.
  • 在索引 1 中,我们有currentMethodName.
  • 在索引 2 中,我们有measureTime.

由于measureTime不是堆栈跟踪的第一个方法,因此请确保我们在堆栈跟踪中还有另一个元素。因此,在您的情况下,是的,它是安全的。


推荐阅读