斯卡拉:从父母那里获得孩子的价值?

时间:2015-08-16 18:21:47

标签: scala

尝试从父类中获取子类的所有字段的值,如下所示:

        for (field <- this.getClass.getDeclaredFields) {
          Logger.debug(field.getName)
          field.get(this)
        }

并收到错误

  

例外:类models.Model $$ anonfun $ 4无法访问其成员   class models.Good with modifiers&#34; private&#34;   在线

field.get(this)

在优秀班级,我没有私人领域:

class Good(id: Option[String]) extends Model[realGood](id){
  lazy val title: String = this.load[String](realObject.get.title)
  lazy val cost: Double = this.load[Double](realObject.get.cost)
}

此代码有什么问题?

1 个答案:

答案 0 :(得分:1)

正如评论中暗示的那样,Scala对java字节码的转换并不总是直截了当(尽管它通常很容易预测,一旦你掌握了它)。特别是,Scala中的公共字段使用java字节码中的公共getter编译为私有字段:

fukaeri:~ dlwh$ cat zzz.scala
class Good(id: Option[String]) {
  lazy val title: String = ???
  lazy val cost: Double = ???
}

fukaeri:~ dlwh$ scalac zzz.scala
fukaeri:~ dlwh$ javap -private Good
Compiled from "zzz.scala"
public class Good {
  private java.lang.String title;
  private double cost;
  private volatile byte bitmap$0;
  private java.lang.String title$lzycompute();
  private double cost$lzycompute();
  public java.lang.String title();
  public double cost();
  public Good(scala.Option<java.lang.String>);
}

除了公共getter之外,您还可以看到Good包含每个声明的公共字段的私有字段。因为字段是lazy val,所以它们还有用于初始化的计算方法,并且有一个bitmap$0字段以确保延迟的val只被初始化一次。

在循环中,您可以使用field.setAccessible(true)来修复异常。