Я думаю, что гораздо проще получить эти значения по умолчанию с помощью отражения Java, а не слишком сложного отражения Scala ...
При компиляции в файл .class значения параметров по умолчанию переводятсяв статические методы с конкретными суффиксами в именах.Эти значения можно получить, вызвав соответствующий метод для ссылки на класс.
Так, например, у нас есть классы case
и не-case:
class Person(name: String, age: Int, numThings: Option[Int] = Some(15))
case class Item(id: Long, other: String = "unknown")
Firstнам нужно определить порядковые индексы параметров для получения значений по умолчанию.Я не знаю ваш вариант использования, поэтому давайте предположим, что вы знаете или рассчитали их.Они будут 3
для Person
и 2
для Item
.Да, они , а не 0.
И этот очень короткий метод возвращает значения:
private def extractDefaultConstructorParamValue(clazz: Class[_],
iParam: Int): Any = {
val methodName = "$lessinit$greater$default$" + iParam
clazz.getMethod(methodName).invoke(clazz)
}
Вызов их с помощью
val defParamNonCase = extractDefaultConstructorParamValue(classOf[Person], 3)
val defParamCase = extractDefaultConstructorParamValue(classOf[Item], 2)
println(defParamNonCase)
println(defParamCase)
выходы
Some(15)
unknown