如何在编译时使用反射

时间:2014-05-20 06:56:00

标签: scala reflection

我遇到这种情况:

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
    }    
}

1 个答案:

答案 0 :(得分:2)

您可以在Scala 2.10及更高版本中使用Scala&#34; def macro2执行此操作。 def宏本质上是一个函数,它将在编译期间使用给定函数的AST(抽象语法树)进行调用,该函数将返回一个AST,编译器将代替对宏的调用

您可以在此处详细了解:http://docs.scala-lang.org/overviews/macros/overview.html