如何在编译时使用反射

dav*_*rez 5 reflection scala

我有这种情况:

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)

joh*_*ren 2

您可以在 Scala 2.10 及更高版本中使用 Scala“def Macro2 来完成此操作。def 宏本质上是一个函数,它将在编译期间使用给定函数的参数的 AST(抽象语法树)进行调用,然后该函数也会返回一个 AST,编译器将用它来代替对宏的调用。

您可以在这里阅读更多相关信息:http://docs.scala-lang.org/overviews/macros/overview.html