Reflection case类上的` productElement(i)`是否使用反射?

Reflection case类上的` productElement(i)`是否使用反射?,reflection,scala,field,product,case-class,Reflection,Scala,Field,Product,Case Class,考虑以下Scala代码段: case class Foo(v1: String, v2: Int, v3: Any) def inspect(p: Product) = (0 until p.productArity).foreach(i => println(p.productElement(i))) inspect(Foo("Moin", 77, null)) 这里调用inspect()是否意味着使用了反射(以任何方式) 我希望能够以某种方式访问case类的字段,而不必显式地

考虑以下Scala代码段:

case class Foo(v1: String, v2: Int, v3: Any)

def inspect(p: Product) =
  (0 until p.productArity).foreach(i => println(p.productElement(i)))

inspect(Foo("Moin", 77, null))
这里调用
inspect()
是否意味着使用了反射(以任何方式)


我希望能够以某种方式访问case类的字段,而不必显式地引用它们,例如通过
foo.v1
,并且我喜欢不需要反射的解决方案,因为我希望它会带来一些开销。

productElement不会使用反射。这是一个编译技巧。在类之前添加case不仅仅是创建一个伴随对象(使用apply方法等等,请参见),它还扩展了trait产品中的类。编译器创建抽象方法productArity和productElement的实现

scalac-print Foo.scala的输出显示:

... case class Foo extends java.lang.Object with ScalaObject with Product {
...
override def productArity(): Int = 3;
override def productElement(x$1: Int): java.lang.Object = {
  <synthetic> val temp6: Int = x$1;
  (temp6: Int) match {
    case 0 => {
      Foo.this.v1()
    }
    case 1 => {
      scala.Int.box(Foo.this.v2())
    }
    case 2 => {
      Foo.this.v3()
    }
    case _ => {
      throw new java.lang.IndexOutOfBoundsException(scala.Int.box(x$1).toString())
    }
  }
};
...
}

回答得好!而且,
-print
选项看起来非常有用,我到目前为止还不知道。谢谢史蒂夫!
scala> case class Foo(v1: String, v2: Int, v3: Any)
defined class Foo

scala> val bar = Foo("Moin", 77, null)
bar: Foo = Foo(Moin,77,null)

scala> bar.productElement(0)
res4: Any = Moin

scala> bar.productElement(1)
res5: Any = 77

scala> bar.productElement(2)
res6: Any = null