我需要在运行时从给定的Class获取所有接口(全部加载在ClassLoader中)。
例如,如果已经以这种方式声明了一个类:
trait B
trait C
trait D
class A extends B with C with D
我想在运行时获取此信息: A取决于B和C以及D 。 java getInterfaces()(或clapper库中的interfaces())方法只给出第一个依赖项,即: A依赖于B 。
有没有办法实现这一目标?
我想通过反思但我不知道怎么做?
答案 0 :(得分:2)
This question给出答案:
import scala.reflect.runtime.universe._
trait B
trait C
class A extends B with C
val tpe = typeOf[A]
tpe.baseClasses foreach {s => println(s.fullName)}
// A, C, B, java.lang.Object, scala.Any
它在REPL中工作,但是当我将代码放入Scala脚本文件并执行它时,它不再是:
typeOf[A]
// Compiler error: No TypeTag available for this.A
使用weakTypeTag
代替
weakTypeTag[A]
// Runtime error: scala.reflect.internal.FatalError:
// ThisType(free type $anon) for sym which is not a class
我在Scala 2.10.0,2.10.1和2.11.0-M2中得到了相同的行为。
答案 1 :(得分:2)
我发现反射的解决方案:
import scala.reflect.runtime.{universe => ru}
val mirror = ru.rootMirror
val t = m.staticClass(classString).typeSignature
t.baseClasses