为了账号安全,请及时绑定邮箱和手机立即绑定

如何获取非案例类的构造函数参数的默认值?

如何获取非案例类的构造函数参数的默认值?

慕桂英4014372 2022-07-14 09:42:08
class Person(name: String, age: Int, numThings: Option[Int] = Some(15))我可以使用 Scala 反射来获取案例类的默认值,如下所示:   val companionType: Type = classSymbol.companion.typeSignature   val companionObject = currentMirror.reflectModule(classSymbol.companion.asModule).instance   val companionMirror = currentMirror.reflect(companionObject)   val defaultValueAccessorMirror =   if (member.typeSignature.typeSymbol.isClass) {     val defaultValueAccessor = companionType.member(TermName("apply$default$" + (index + 1)))     if (defaultValueAccessor.isMethod) {       Some(companionMirror.reflectMethod(defaultValueAccessor.asMethod))     } else {       None     }   } else {     None   }这将获得生成的伴随对象中的方法,该方法在调用时会产生默认值。可悲的是,非案例类似乎没有此功能。如何使用 Scala 或 Java 反射在上面的示例中获取 Person.numThings 的默认值?
查看完整描述

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


查看完整回答
反对 回复 2022-07-14
  • 1 回答
  • 0 关注
  • 86 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信