Scala中生成代码的性能和缓存
我需要在运行时生成一个trait的实现,然后在trait的实例上执行一个已知的方法。在本例中,我正在运行Scala中生成代码的性能和缓存,scala,reflection,scala-quasiquotes,Scala,Reflection,Scala Quasiquotes,我需要在运行时生成一个trait的实现,然后在trait的实例上执行一个已知的方法。在本例中,我正在运行A的A方法: import reflect.runtime._, universe._, tools.reflect.ToolBox package p { trait A { def a: String } val tb = currentMirror.mkToolBox() val d: A = tb.eval(q"""class C extends p.A { def a
A
的A
方法:
import reflect.runtime._, universe._, tools.reflect.ToolBox
package p {
trait A { def a: String }
val tb = currentMirror.mkToolBox()
val d: A = tb.eval(q"""class C extends p.A { def a = "foo" }; new C""").asInstanceOf[A]
println(d.a) // "foo"
}
围绕这一点的几个问题:
tb.eval
是否生成与scalac在编译时而不是运行时编译的字节码相同的字节码替代
abstract class BaseQuery[R <: Result[R]] {
def init(parameters: Option[JSONObject])
def execute(partitionKey: String, subpartitionKey: String, numSubpartitions: Int, page: ColumnSet, referenceData: Map[String, Any]): Option[R]
}
abstract class BaseQuery[R如果您所做的是对性能敏感的,并且反射和代码生成的混合可能是最糟糕的答案(另外,通常是不安全的)。肯定有更优雅的方法,但您需要重新审视“我需要在运行时生成特性的实现”的假设更详细地描述你潜在的问题…@DanielL。很抱歉回答得太慢,我正在旅行。我在问题中添加了更多的细节。我关心的不是生成代码本身的性能,而是运行生成的代码。我也愿意接受其他建议。