在运行时在一个scala项目中加载一个类

问题描述:

我想在运行时加载一些scala类,该类在我的scala项目中呈现。 更确切地说,在我的项目的根文件夹,我有TmpCaseClass.scala:在运行时在一个scala项目中加载一个类

class TmpHBaseCaseClass(val adresse:String,val age:Int,val nom:String,val id:Int,val salaire:Float) 

我想编译它,使用工具箱中像这样使用它在运行时:

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() 

但我遇到follwing错误:

Exception in thread "main" scala.tools.reflect.ToolBoxError: reflective compilation has failed:

illegal start of definition at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$ToolBoxGlobal.throwIfErrors(ToolBoxFactory.scala:316) at scala.tools.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.apply$mcV$sp(AbstractFunction0.scala:12) at 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) at Main.main(Main.scala)

线17(其中的错误发生)对应于:

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

我该如何摆脱这个错误?

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

2)您也无法投射到Class,因为编译返回Unit。您可能想要放置另一条线,如scala.reflect.classTag[TmpCaseClass].runtimeClass。如果这是您需要的,您还可以获得树(AST)作为tb.parse的结果。

+0

谢谢,我没有错误了,但现在我不知道该怎么办。我做了instance.getClass.getFields.foreach(x => println(x.getName)),但没有打印。我不知道如何使用我刚刚构建的对象。 –