2013-09-10 47 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评论。 –

相关问题