尝试从父类中获取子类的所有字段的值,如下所示:
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)
}
此代码有什么问题?
答案 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)
来修复异常。