1 回答
TA贡献1824条经验 获得超8个赞
我认为通过 Java 反射检索这些默认值应该更容易,而不是这种过于复杂的 Scala 反射......
当编译成 .class 文件时,默认参数值被转换为名称中带有特定后缀的静态方法。可以通过调用类引用上的相应方法来检索这些值。
因此,例如,我们有 acase类和非 case 类:
class Person(name: String, age: Int, numThings: Option[Int] = Some(15))
case class Item(id: Long, other: String = "unknown")
首先,我们需要确定要为其检索默认值的参数的序数索引。我不知道您的用例,所以假设您知道或计算了它们。他们将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
添加回答
举报