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。
有办法实现吗?
我想通过反思,但我不知道如何?
这个问题给出了答案:
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 中也得到了相同的行为。
| 归档时间: |
|
| 查看次数: |
844 次 |
| 最近记录: |