scala - 隐式提取 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")
}
}
}
...
正如你所看到的,我有mesureTime
和handleError
函数,我将函数的名称作为字符串传递给他们,有没有办法隐式地使它,我的意思是它会采用函数名称,如果没有 - 有办法提取函数名称和打印它,也关于参数。
解决方案
里面计算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
不是堆栈跟踪的第一个方法,因此请确保我们在堆栈跟踪中还有另一个元素。因此,在您的情况下,是的,它是安全的。
推荐阅读
- python - numpy中张量的矩阵向量乘法
- eclipse - Eclipse 在 ABAP 程序启动时显示登录屏幕
- laravel - 获取在 Laravel API 中执行的数据库语句列表
- python - Python比较和区分自定义对象
- php - 在 Laravel 8 中运行多个 PHPUnit 测试时出错
- nginx - nginx 可以通过哪些方式向我的应用服务器发送请求?
- java - wsdl2java 生成带有长名称的 java 类
- python - Python Scrapy OSError: [WinError 123] 文件名、目录名或卷标语法不正确:
- c++ - cv::Mat::clone() 是否比分配由 cv::Mat::zeros() 创建的矩阵更有效?
- python - 打破 try-except 块