我遇到这种情况:
class Column {
}
trait Table {
lazy val columns: List[Column] = ....
}
class MyTable extends Table {
val column1 = new Column()
val column2 = new Column()
}
我想在编译时获取派生类中定义的列列表。
我已经能够通过使用运行时反射来完成,但我听说它在Android和ProGuard中可能会出现问题。所以,如果可能的话,我想在编译时这样做。
https://groups.google.com/forum/#!topic/scala-on-android/Q0E_OMYqE0A
这是我的运行时反射实现:
trait Table {
lazy val columns: List[Column] = {
import scala.reflect.runtime.universe._
val rm = scala.reflect.runtime.currentMirror
val columns = rm.classSymbol(this.getClass).toType.members.collect {
case m: MethodSymbol if m.isGetter && m.returnType <:< typeOf[Column] => m
}
val espejo = rm.reflect(this)
(for (col <- columns) yield
espejo.reflectMethod(col).apply().asInstanceOf[Column]).toList
}
}
答案 0 :(得分:2)
您可以在Scala 2.10及更高版本中使用Scala&#34; def macro2执行此操作。 def宏本质上是一个函数,它将在编译期间使用给定函数的AST(抽象语法树)进行调用,该函数将返回一个AST,编译器将代替对宏的调用
您可以在此处详细了解:http://docs.scala-lang.org/overviews/macros/overview.html