gpt4 book ai didi

对 Scala 案例类的反射(reflection)

转载 作者:行者123 更新时间:2023-12-04 00:09:22 24 4
gpt4 key购买 nike

我正在尝试编写一个可以混合到案例类中的特征(在 Scala 2.8 中),允许在运行时检查其字段,用于特定的调试目的。我想按照它们在源文件中声明的顺序取回它们,并且我想省略 case 类中的任何其他字段。例如:

trait CaseClassReflector extends Product {

def getFields: List[(String, Any)] = {
var fieldValueToName: Map[Any, String] = Map()
for (field <- getClass.getDeclaredFields) {
field.setAccessible(true)
fieldValueToName += (field.get(this) -> field.getName)
}
productIterator.toList map { value => fieldValueToName(value) -> value }
}

}

case class Colour(red: Int, green: Int, blue: Int) extends CaseClassReflector {
val other: Int = 42
}

scala> val c = Colour(234, 123, 23)
c: Colour = Colour(234,123,23)

scala> val fields = c.getFields
fields: List[(String, Any)] = List((red,234), (green,123), (blue,23))

上面的实现显然是有缺陷的,因为它通过这些字段上的值的相等来猜测产品在产品中的字段位置与其名称之间的关系,因此以下内容将不起作用:
Colour(0, 0, 0).getFields

有什么办法可以实现吗?

最佳答案

在我见过的每个示例中,字段的顺序是相反的:getFields 数组中的最后一项是 case 类中列出的第一项。如果您“很好地”使用案例类,那么您应该能够映射 productElement(n)getDeclaredFields()( getDeclaredFields.length-n-1) .

但这是相当危险的,因为我不知道规范中的任何内容坚持必须那样做,并且如果您覆盖 case 类中的 val,它甚至不会出现在 getDeclaredFields 中(它会出现在该父类(super class)的字段中)。

您可能会更改您的代码以假设事情是这样的,但请检查具有该名称的 getter 方法和 productIterator 是否返回相同的值,如果没有则抛出异常(这意味着您实际上并不知道对应于什么什么)。

关于对 Scala 案例类的反射(reflection),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2224251/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com