首页 文章

Scala反射:为什么getMethods返回超类中定义的私有val?

提问于
浏览
1

下面的代码定义了一个特征 T ,其中包含私有val someVal 和一个扩展 T 的匿名类 . 如果我们从匿名类的实例调用 getMethods ,则 someVal 被列为公共方法:

scala> trait T { private val someVal = 3 }
defined trait T

scala> new T {}.getClass.getMethods.apply(0)
res2: java.lang.reflect.Method = public int $anon$1.$line6$$read$T$$someVal()

当然 someVal 在这个子类中是不可访问的,但为什么它甚至在 getMethods 的返回中,作为公共?

1 回答

  • 3

    trait s编译为 interfaces ,因为它们需要多重继承 . 但是接口既不具有字段也不具有非 public 成员 . 因此,字段变为一对 public 访问器,由特征的名称破坏,编译器的任务是将字段放入所有子类并实现访问器 . 尝试访问 someValT 上的任何方法都通过getter,而包含构造函数代码的 static $init$ 函数使用setter将其设置为 3 . 如果您的 val 被声明为 public ,则getter的名称将被解组为 someVal ,外部代码将使用该名称,如果它也是 var ,则setter将变为 someVal_= ,随后将变为 someVal_$eq . 无论如何,可怕的长名称非常足以阻止任何人使用它们,并且只有在进行Java互操作时它才有意义 .

相关问题