You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Scala 3中通过反射获取Case Class字段的值

如何通过反射获取Scala 3中Case Class的指定字段值

问题背景

正在迁移原Scala 2反射代码到Scala 3,尝试使用scala-reflection库获取Case Class指定字段的值,已有如下示例代码:

$ scala-cli -j system -S 3.4.2 --dep co.blocke::scala-reflection:2.0.8
scala> import co.blocke.scala_reflection.RType

scala> case class A(a: Int, b: String)
// defined case class A

scala> import co.blocke.scala_reflection.rtypes.ScalaClassRType

scala> val t = RType.of[A].asInstanceOf[ScalaClassRType[A]]
val t: co.blocke.scala_reflection.rtypes.ScalaClassRType[A] = ScalaClassRType(rs$line$2$A,rs$line$2$.A,List(),List(),List(),List(ScalaFieldInfo(0,a,IntRType(),Map(),None,None,false), ScalaFieldInfo(1,b,StringRType(),Map(),None,None,false)),Map(),List(java.lang.Object, scala.Product, java.io.Serializable),false,false,true,false,Map(),List(),List(),false)

scala> t.fields.find(_.name == "a")
val res2: Option[co.blocke.scala_reflection.rtypes.FieldInfo] = Some(ScalaFieldInfo(0,a,IntRType(),Map(),None,None,false))

scala> val c = A(3,"hola")
val c: A = A(3,hola)

方案1:使用scala-reflection库获取字段值

找到目标字段后,直接调用FieldInfo的get方法传入实例即可获取值:

// 从已找到的字段中获取值
t.fields.find(_.name == "a").foreach { field =>
  val aValue = field.get(c)
  println(s"Field 'a' value: $aValue") // 输出: Field 'a' value: 3
}

scala-reflection的FieldInfo封装了反射细节,get方法会自动处理字段的访问逻辑,无需手动操作底层反射API。

方案2:使用izumi-reflect库(更简便)

如果追求更简洁的API,推荐使用izumi-reflect,它对Scala 3的支持更友好,代码更简洁:

  1. 添加依赖:
scala-cli -j system -S 3.4.2 --dep dev.zio::izumi-reflect:2.3.1
  1. 示例代码:
import izumi.reflect._

case class A(a: Int, b: String)
val c = A(3, "hola")

// 直接获取指定字段的值
val aValue = Tag[A].field("a").get(c)
println(aValue) // 输出: 3

izumi-reflect的Tag API无需手动转换类型,直接通过字段名定位并获取值,代码量更少,可读性更高。

内容的提问来源于stack exchange,提问作者david.perez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 04:46:02