[Scala工具箱]:在运行时编译Case类,然后示例化它

7qhs6swi  于 2022-11-09  发布在  Scala
关注(0)|答案(1)|浏览(163)

我正在尝试使用Scala反射工具箱定义一个Case类并示例化它。做这件事最好的方法是什么?
在我做的那一刻

val codeToCompile = q"""case class Authentication(email:String)"""
val tree = toolbox.parse(codeToCompile) 
val classDefinition : ClassDef = tree.asInstanceOf[ClassDef]
val definedClass = toolbox.define(classDefinition)

我希望在将Case类定义到工具箱中之后,使用它的构造函数在运行时示例化它,如

val codeToCompile = q"""val myAuth = Authentication("test@gmail.com")"""
val tree = toolbox.parse(codeToCompile)
val binary = toolbox.compile(tree)()

我收到错误:找不到身份验证...我该怎么做呢?

ddrv8njm

ddrv8njm1#

首先,s插值器生成字符串,q插值器生成树。因此,要么使用不带.parseq"...",要么使用带.parses"..."
**其次,**使用您已有的ClassSymboldefinedClass
第三,.apply是伴随对象方法。因此,请使用.companion
**第四,**使用工具箱在单行q"val x = ???"中定义局部变量没有太大意义,反正以后很难使用这个TermSymbol(与ClassSymbol相反)。

尝试

val codeToCompile = s"""case class Authentication(email:String)"""
val tree = toolbox.parse(codeToCompile)
val classDefinition : ClassDef = tree.asInstanceOf[ClassDef]
val definedClass = toolbox.define(classDefinition)

val codeToCompile1 = q"""${definedClass.companion}("test@gmail.com")"""
val myAuth = toolbox.eval(codeToCompile1) // Authentication(test@gmail.com)

相关问题