簡體   English   中英

Scala反射:為什么getMethods返回超類中定義的私有val?

[英]Scala reflection: Why does getMethods return private vals defined in superclass?

下面的代碼定義了一個特征T ,它具有私有val someVal和一個擴展T的匿名類。 如果我們從匿名類的實例調用getMethodssomeVal被列為公共方法:

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的名稱將被someValsomeVal ,而外部代碼將使用它,如果它也是var ,則setter將someVal_=someVal_= ,隨后將someVal_$eq 無論如何,可怕的長名稱非常足以阻止任何人使用它們,並且只有在進行Java互操作時它才有意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM