Scala:在运行时获取mixin接口

时间:2013-05-13 10:38:31

标签: scala reflection traits mixing scala-java-interop

我需要在运行时从给定的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

有没有办法实现这一目标?

我想通过反思但我不知道怎么做?

2 个答案:

答案 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