【问题标题】:Scala : get mixin interfaces at runtimeScala:在运行时获取 mixin 接口
【发布时间】:2013-05-13 10:38:30
【问题描述】:

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

有没有办法做到这一点?

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

【问题讨论】:

  • 问题是我不知道类先验。所以我不能调用 typeOf[A] 我得到的是一个通过读取目标/类并用 Class.forName 激发它们构建的类列表,以便我在运行时获得一个未知类的列表。 val classes: List[Class[_] = ... // 我的读取类列表 classes.map{c=> c-> ???} // 映射及其接口

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


【解决方案1】:

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

import scala.reflect.runtime.{universe => ru}
val mirror = ru.rootMirror
val t = m.staticClass(classString).typeSignature
t.baseClasses

【讨论】:

    【解决方案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 中得到了相同的行为。

    【讨论】:

    • 也许您缺少 REPL 中授予的 scala-reflect 依赖项 (libraryDependencies += "org.scala-lang" % "scala-reflect" % "2.10.0")。
    • 感谢您的建议。我明确地将它添加到类路径中——如果我没记错的话,scala.bat 无论如何都会自动执行它——但没有任何改变。此外,我假设如果该库尚未存在,import scala.reflect.runtime.universe._(之前我的回答中省略了导入)将失败。
    猜你喜欢
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    相关资源
    最近更新 更多