Можете ли вы получить имя класса в качестве константы для аннотаций scala? - PullRequest
6 голосов
/ 27 сентября 2019

У меня есть аннотация , для которой требуется строка, описывающая имя класса, например, com.package.MyClass.

Я могу передать его как строку, но хотел бы, чтобы он ссылался на сам класс для компиляции / рефакторинга.

Однако я не могу использовать MyClass.getName. или classOf[MyClass].toString, поскольку он не является константой:

Compilation error[annotation argument needs to be a constant

Есть ли способ получить константную ссылку на имя класса?Или другой способ ссылаться на имена классов в виде строки в аннотациях?

1 Ответ

3 голосов
/ 27 сентября 2019

Вы не можете использовать classOf, потому что он работает во время выполнения, а аннотации Java требуют констант в качестве аргументов.Вместо этого вы можете захватить имя вашего класса во время компиляции, используя макросы.

Я бы порекомендовал вам использовать некоторую библиотеку, которая может это сделать, например, 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])
   )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...