在scala项目中

时间:2017-08-02 12:47:11

标签: scala reflection

我想在运行时加载一些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.reflect.ToolBoxFactory $ ToolBoxImpl $ ToolBoxGlobal.throwIfErrors(ToolBoxFactory.scala:316)     在   scala.tools.reflect.ToolBoxFactory $ ToolBoxImpl $ ToolBoxGlobal.parse(ToolBoxFactory.scala:291)     在   scala.tools.reflect.ToolBoxFactory $ ToolBoxImpl $$ anonfun $解析$ 1.适用(ToolBoxFactory.scala:417)     在   scala.tools.reflect.ToolBoxFactory $ ToolBoxImpl $$ anonfun $解析$ 1.适用(ToolBoxFactory.scala:414)     在   scala.tools.reflect.ToolBoxFactory $ ToolBoxImpl $ withCompilerApi $ .liftedTree2 $ 1(ToolBoxFactory.scala:355)     在   scala.tools.reflect.ToolBoxFactory $ ToolBoxImpl $ withCompilerApi $。适用(ToolBoxFactory.scala:355)     在   scala.tools.reflect.ToolBoxFactory $ ToolBoxImpl.parse(ToolBoxFactory.scala:414)     在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.apply $ MCV $ SP(AbstractFunction0.scala:12)     在scala.App $$ anonfun $ main $ 1.apply(App.scala:76)at   scala.App $$ anonfun $ main $ 1.apply(App.scala:76)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)at Main $ .main(Main.scala:13)     在Main.main(Main.scala)

第17行(发生错误的地方)对应于:

val clazz = tb.compile(tb.parse("./TmpCaseClass.scala"))().asInstanceOf[Class[_]]

我怎么能摆脱这个错误?

1 个答案:

答案 0 :(得分:0)

1)尝试解析文件内容,而不是文件名。

2)此外,您无法转换为Class,因为编译返回Unit。您可能想要放置另一行,例如scala.reflect.classTag[TmpCaseClass].runtimeClass。如果这是您需要的,您还可以获得tb.parse的结果树(AST)。