我想在运行时加载一些scala类,该类在我的scala项目中呈现 . 更准确地说,在我的项目的根文件夹中,我有TmpCaseClass.scala:
class TmpHBaseCaseClass(val adresse:String,val age:Int,val nom:String,val id:Int,val salaire:Float)
我想编译它并在运行时使用toolBox使用它,如下所示:
val tb = universe.runtimeMirror(getClass.getClassLoader).mkToolBox()
val clazz = tb.compile(tb.parse("./TmpCaseClass.scala"))().asInstanceOf[Class[_]]
val ctor = clazz.getDeclaredConstructors()(0)
val instance = ctor.newInstance()
但我遇到了以下错误:
线程“main”中的异常scala.tools.reflect.ToolBoxError:反射编译失败:在scala.tools的scala.tools.refols.ToolBoxFactory $ ToolBoxImpl $ ToolBoxGlobal.throwIfErrors(ToolBoxFactory.scala:316)中非法启动定义 . reflect.ToolBoxFactory $ ToolBoxImpl $ ToolBoxGlobal.parse(ToolBoxFactory.scala:291)at scala.tools.reflect.ToolBoxFactory $ ToolBoxImpl $$ anonfun $ parse $ 1.apply(ToolBoxFactory.scala:417)at scala.tools.reflect.ToolBoxFactory $ ToolBoxImpl $$ anonfun $ parse $ 1.apply(ToolBoxFactory.scala:414)at scala.tools.reflect.ToolBoxFactory $ ToolBoxImpl $ withCompilerApi $ .liftedTree2 $ 1(ToolBoxFactory.scala:355)at scala.tools.reflect.ToolBoxFactory $ ToolBoxImpl $ withCompilerApi $ .apply(ToolBoxFactory.scala:355)at scala.tools.reflect.ToolBoxFactory $ ToolBoxImpl.parse(ToolBoxFactory.scala:414)at Main $ .delayedEndpoint $ Main $ 1(Main.scala:17)at Main $ delayedInit $ body.apply(Main.scala:13)at scala.Function0 $ class.apply $ mcV $ sp(Function0.scala:34)at scala.runtime.AbstractFunction0.ap在scala.App $$ anonfun $ main $ 1.apply(App.scala:76)scala.App $$ anonfun $ main $ 1.apply(App.scala:76)ply $ mcV $ sp(AbstractFunction0.scala:12) at scala.collection.immutable.List.foreach(List.scala:381)at scala.collection.generic.TraversableForwarder $ class.foreach(TraversableForwarder.scala:35)at scala.App $ class.main(App.scala:76 )在Main.main(Main.scala)的Main $ .main(Main.scala:13)
第17行(发生错误的地方)对应于:
val clazz = tb.compile(tb.parse("./TmpCaseClass.scala"))().asInstanceOf[Class[_]]
我怎么能摆脱这个错误?
1 回答
1)尝试解析文件内容,而不是文件名 .
2)你也无法转换为
Class
,因为编译返回Unit
. 您可能想要放置另一行,如scala.reflect.classTag[TmpCaseClass].runtimeClass
. 你也可以通过tb.parse
获得树(AST),如果这是你需要的 .