2013-09-10 44 views
1

根據docs heredeclarations應該是members的子集,用於類中聲明的事物,不是繼承的。那麼爲什麼各個班級沒有報告聲明?爲什麼scala反射報告某些類沒有聲明?

scala> import scala.reflect.runtime.universe._ 
scala> typeTag[java.lang.System].tpe.declarations 
res5: reflect.runtime.universe.MemberScope = SynchronizedOps() 
+1

類'java.lang.System'沒有在Scala中的任何成員。這個帖子告訴你如何得到它:http://stackoverflow.com/questions/11020746/get-companion-object-instance-with-new-scala-reflection-api – gzm0

+0

該代碼拋出一個異常,如果我用'java.lang.System'嘗試它,因爲它查找'System $'。不清楚如何獲得靜態方法列表。 –

+4

scala> typeOf [System] .typeSymbol.companionSymbol .typeSignature.declarations res5:reflect.runtime.universe.MemberScope = SynchronizedOps(value in,value out,value err,...) –

回答

3

其原因是,這兩個membersdeclarations只考慮對象的成員。但是,在java.lang.System中聲明的所有函數都是靜態的。

這很有道理,因爲從scala的角度來看,沒有靜態成員。靜態成員的等價物是在模塊中定義的方法/值(使用object而不是class)。因此,scala-reflection會像在一個模塊中定義一個Java類的靜態成員 - 更具體地說,在java-class的伴隨對象中定義。 (請注意,與scala定義的伴隨對象相比,這些「java-companion-objects」在VM級別上不存在)。

我在斯卡拉反射不是專家,所以我不能告訴你,你會怎麼找到靜態成員:-(

+0

要查找靜態成員,請參閱我的問題下的Eugene評論。 –

相關問題