2016-11-10 79 views
1

我想在scala中实现一个函数,它可以解析源代码(类对象)的字符串并在运行时将其编译为对象。Scala解析字符串类并在运行时编译

例如,该功能是我迄今为止所尝试的功能。我的目标是运行它在运行时环境编译,我可以使用它的构造函数或它的函数。此代码有运行时错误,但我不明白如何解决反射类错误。谢谢!

object test { 
     def main(args: Array[String]): Unit = { 
      val m = universe.runtimeMirror(getClass.getClassLoader) 
      val tb = m.mkToolBox() 
      val clazz = tb.compile(tb.parse("class insideclass {\n val model_field = 5\n def insideclass(model: Int) = {\n  val model_field = model \n } \n\n def test() : Int = {\n  model_field\n }\n\n}\nscala.reflect.classTag[insideclass].runtimeClass"))().asInstanceOf[Class[_]] 
      val classinside = universe.typeOf[Class[_]].typeSymbol.asClass 
      val ctor = universe.typeOf[Class[_]].declaration(universe.nme.CONSTRUCTOR).asMethod 
      val cm=m.reflectClass(classinside) 
      val ctorm=cm.reflectConstructor(ctor) 
      println(ctorm(10).test()) 
     } 
    } 

回答

1

问题是外部编译器不知道“内部类”作为类定义存在。一种解决方案是让内部类扩展一些对于内部和外部编译器都知道的其他类,例如Function [Int,Int]。在这种情况下,您需要将您的“测试”方法重命名为“应用”。

val clazz = tb.compile(tb.parse("class PersonData(x:Int) extends Function[Int, Int] {\n val allen = x.toInt\n\n override def apply(x:Int):Int = allen}\n scala.reflect.classTag[PersonData].runtimeClass"))().asInstanceOf[Class[_]] 

val ctor = clazz.getDeclaredConstructors()(0) 

val instance = ctor.newInstance(new Integer(1)) 
// this cast can succeed because the outside knows what is Function[Int, Int] 
println(instance.asInstanceOf[Function[Int, Int]].apply(1))