我有这种情况:
class Column {
}
trait Table {
lazy val columns: List[Column] = ....
}
class MyTable extends Table {
val column1 = new Column()
val column2 = new Column()
}
Run Code Online (Sandbox Code Playgroud)
我想在编译时获取派生类中定义的列的列表.
我已经能够通过使用运行时反射来做到,但我听说它在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
}
}
Run Code Online (Sandbox Code Playgroud)
您可以在 Scala 2.10 及更高版本中使用 Scala“def Macro2 来完成此操作。def 宏本质上是一个函数,它将在编译期间使用给定函数的参数的 AST(抽象语法树)进行调用,然后该函数也会返回一个 AST,编译器将用它来代替对宏的调用。
您可以在这里阅读更多相关信息:http://docs.scala-lang.org/overviews/macros/overview.html
| 归档时间: |
|
| 查看次数: |
1527 次 |
| 最近记录: |