你能得到一个 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])
)
)
我有一个 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])
)
)