2013-05-13 77 views
4

我需要從運行時獲得給定類的所有接口(全部加載到ClassLoader中)。Scala:在運行時獲取mixin接口

舉例來說,如果一個類被聲明是這樣的:

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

的問題是,我不知道類*先驗*。所以我不能打電話給 typeOf [A] 我得到的是通過讀取目標/類並使用Class.forName對它們進行初始化所構建的類的列表,以便在運行時獲取未知類的列表。 val classes:List [Class [_] = ... //我讀取的類列表 classes.map {c => c-> ???} //使用其接口映射 – Mathieu 2013-05-14 13:47:40

回答

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相同的行爲。

+0

感謝您的參與。 – Mathieu 2013-05-13 12:45:43

+0

也許你錯過了在REPL中授予的_scala-reflect_ dependency('libraryDependencies + =「org.scala-lang」%「scala-reflect」%「2.10.0」')。 – jeslg 2013-05-27 18:17:57

+0

感謝您的建議。我明確地將它添加到了classpath中 - 如果我沒有弄錯的話 - 哪個'scala.bat'會自動執行 - 但沒有任何變化。此外,我假設'import scala.reflect.runtime.universe._'(以前從我的答案中省略了導入)將會失敗,如果庫已經不存在的話。 – 2013-05-28 07:06:43

2

我發現反射的解決方案:

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