Scala:在运行时获取 mixin 接口

Mat*_*ieu 5 reflection scala mixing traits scala-java-interop

我需要在运行时从给定的类获取所有接口(全部加载在类加载器中)。

例如,如果一个类是这样声明的:

trait B
trait C
trait D    
class A extends B with C with D
Run Code Online (Sandbox Code Playgroud)

我想在运行时获取以下信息:A 依赖于 B、C 和D。java getInterfaces() (或 clapper 库中的interfaces())方法仅给出第一个依赖项,即:A 依赖于 B

有办法实现吗?

我想通过反思,但我不知道如何?

Mal*_*off 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   
Run Code Online (Sandbox Code Playgroud)


它在 REPL 中工作,但是当我将代码放入 Scala 脚本文件并执行它时,它不再工作:

typeOf[A]
  // Compiler error: No TypeTag available for this.A
Run Code Online (Sandbox Code Playgroud)

使用weakTypeTag代替也没有帮助

weakTypeTag[A]
  // Runtime error: scala.reflect.internal.FatalError:
  // ThisType(free type $anon) for sym which is not a class
Run Code Online (Sandbox Code Playgroud)

我在 Scala 2.10.0、2.10.1 和 2.11.0-M2 中也得到了相同的行为。