加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何使用scala反射2.10检查案例类的哪些参数具有默认值

发布时间:2020-12-16 08:57:40 所属栏目:安全 来源:网络整理
导读:我的任务是找到案例类的参数名称,其中有默认值. 在2.9我从scalap使用ScalaSigParser并做了类似的事情: (...)case x: MethodSymbol if x.name.startsWith("init$default$") = (...)(...) 我希望2.10中的反思能让我更容易地获得这种信息. 最后我想编写一个宏,
我的任务是找到案例类的参数名称,其中有默认值.

在2.9我从scalap使用ScalaSigParser并做了类似的事情:

(...)
case x: MethodSymbol if x.name.startsWith("init$default$") => (...)
(...)

我希望2.10中的反思能让我更容易地获得这种信息.

最后我想编写一个宏,我将在case类的伴随对象中包含它,它将自动创建一个用于该case类的序列化/反序列化的代码.为此,我需要知道哪些参数具有默认值.

解决方法

目前没有办法做到这一点,但是我刚刚提交了一个拉取请求(https://github.com/scala/scala/pull/1047),它添加了TermSymbol.isDefaultParam,它公开了所请求的功能.我希望它能进入RC1和2.10.0决赛.

scala> case class C(x: Int,y: Int = 2)
defined class C

scala> val ctor = typeOf[C].declaration(nme.CONSTRUCTOR).asMethod
ctor @ 39fe9830: reflect.runtime.universe.MethodSymbol = constructor C

scala> ctor.params.flatten filter (_.asTerm.isDefaultParam)
res0 @ 7ad2093b: List[reflect.runtime.universe.Symbol] = List(value y)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读