【发布时间】:2015-12-07 10:17:06
【问题描述】:
假设User 是一个包含用户信息的案例类:
case class User(name: String, age: Int)
给定一个字段名称(例如"name" 或"age"),我想返回一个提取该字段的函数(无需再次解析字段名称)。简而言之,我需要这个来工作:
val u = User(name = "john",age = 44)
val func = extractFunctionFromFieldName("name") // returns func: User => Any
func(u) // return "john"
阅读反射,我得到了这样的工作:
def extractFunctionFromFieldName(s: String): User => Any = {
val f = classOf[User].getDeclaredField(s)
f.setAccessible(true)
u: User => f.get(u)
}
问题是这个函数是不可序列化的,因为java.lang.reflect.Field 是不可序列化的。
有什么建议或替代方案吗?
笔记/更多背景:
- 字段列表远远大于
{name,age},并且还在不断增长。这就是为什么我要避免硬编码 - 使用
productElement应该不会出现序列化问题,因为字段已替换为数字。但我了解产品元素的顺序无法保证。 - 顺便说一句,我需要它是可序列化的,因为我将它与 apache spark 一起使用。
【问题讨论】:
标签: scala serialization reflection apache-spark case-class