![](/img/trans.png)
[英]Scala Reflection : why getMethods can return the val members?
[英]Scala reflection: Why does getMethods return private vals defined in superclass?
下面的代碼定義了一個特征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
的返回中,作為公共?
trait
s編譯為interfaces
,因為它們需要多重繼承。 但是接口既沒有字段也沒有非public
成員。 因此,字段成為一對public
訪問器,由特征名稱破壞,編譯器的任務是將字段放入所有子類並實現訪問器。 T
試圖訪問someVal
任何方法都通過getter,而包含構造函數代碼的static
$init$
函數使用setter將其設置為3
。 如果你的val
被聲明為public
,那么getter的名稱將被someVal
為someVal
,而外部代碼將使用它,如果它也是var
,則setter將someVal_=
為someVal_=
,隨后將someVal_$eq
。 無論如何,可怕的長名稱非常足以阻止任何人使用它們,並且只有在進行Java互操作時它才有意義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.