我有以下代码来检查A类中的x
是否为val或var
import scala.reflect.runtime.universe._
class A {
val x = 10
}
val y: Symbol = typeOf[A].member(TermName("x"))
println(y.asTerm.isVal + "," + y.asTerm.isVar)
println()
输出结果为:
false,false
x
被声明为val,我会问为什么y.asTerm.isVal
被评估为false
答案 0 :(得分:2)
如果你这样做,你可以得到一个提示:
browserHistory.listen((location, action) => {
console.log('location change:', location, action);
})
有两个typeOf[A].decls // List everything inside A
SynchronizedOps(constructor A, value x, value x)
,因为value x
有两种形式。记住Scala的统一访问原则:公共x
永远不会真正公开。相反,它们是val
与生成的getter private[this] val
相结合。列表中的一个def
是value x
,另一个是private[this] val x
(Scala无效,但就是这样)。您可以使用def x = x
定义该类以查看它。
-Xprint:typer
返回公开typeOf[A].member(TermName("x"))
,而不是返回def x
。您可以(从最少到最具体)private[this] val x
/ y.asTerm.isMethod
/ .isAccessor
进行验证。
如果您只需要获取该字段的设置者,则可以致电.isGetter
,如果y.asTerm.setter
为def x_=
,则会返回x
,并返回{ {1}}如果没有setter。如果您需要字段本身,可以拨打var
,这实际上是NoSymbol
:y.asTerm.accessed.asTerm
。