你能得到一个 class 名称作为 scala 注释的常量吗?

Can you get a class name as a constant for scala annotations?

我有一个 annotation,它需要一个描述 class 名称的字符串,例如 com.package.MyClass

我可以将它作为字符串传递,但希望它为 compilation/refactoring.

引用 class 本身

但是我不能使用 MyClass.getName.classOf[MyClass].toString,因为它不是常量:

Compilation error[annotation argument needs to be a constant

有没有办法获取对 classes 名称的常量引用?或者另一种在注释中将 class 名称引用为字符串的方法?

您不能使用 classOf,因为它在运行时运行,并且 Java 注释需要常量作为参数。相反,您可以在编译期间使用宏捕获 class 的名称。

我建议您使用一些可以做到这一点的库,例如 NameOf

添加对您的 build.sbt 的依赖:

libraryDependencies += "com.github.dwickern" %% "scala-nameof" % "1.0.3" % "provided"

然后你可以像这样使用它:

import com.github.dwickern.macros.NameOf._

@ApiImplicitParams(Array[ApiImplicitParam](
   new ApiImplicitParam(
     name="Something",
     dataType= qualifiedNameOfType[com.package.MyClass])
   )
)