4

我需要在运行时从给定的类中获取所有接口(全部加载在 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

有没有办法做到这一点?

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

4

2 回答 2

2

这个问题给出了答案:

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 也有同样的行为。

于 2013-05-13T12:32:17.050 回答
2

我通过反射找到的解决方案:

import scala.reflect.runtime.{universe => ru}
val mirror = ru.rootMirror
val t = m.staticClass(classString).typeSignature
t.baseClasses
于 2013-05-13T15:22:55.863 回答