从字符串生成类,并在斯卡拉2.10实例化它(Generating a class from stri

2019-06-17 21:12发布

在斯卡拉2.10我如何生成的字符串类(可能使用工具箱API)后与Scala的反射被实例化?

Answer 1:

WRT编辑工具箱只能运行表达式=返回值,但没有造成类或文件/字节数组与编译结果。

但是它仍然可能实现你想要什么,因为在斯卡拉它很容易使用隐式值从类型层面去值水平:

编辑 。 在2.10.0-RC1的一些方法ToolBox已被重新命名。 parseExpr现在只是parse ,并runExpr现在被称为eval

scala> import scala.reflect.runtime._ // requires scala-reflect.jar
                                      // in REPL it's implicitly added 
                                      // to the classpath
                                      // but in your programs
                                      // you need to do this on your own
import scala.reflect.runtime

scala> val cm = universe.runtimeMirror(getClass.getClassLoader)
cm @ 41d0fe80: reflect.runtime.universe.Mirror = JavaMirror with scala.tools.nsc.interpreter.IMain$TranslatingClassLoader...

scala> import scala.tools.reflect.ToolBox // requires scala-compiler.jar
                                          // in REPL it's implicitly added 
                                          // to the classpath
                                          // but in your programs
                                          // you need to do this on your own
import scala.tools.reflect.ToolBox

scala> val tb = cm.mkToolBox()
tb: scala.tools.reflect.ToolBox[reflect.runtime.universe.type] = scala.tools.reflect.ToolBoxFactory$ToolBoxImpl@3a962da5

scala> tb.runExpr(tb.parseExpr("class C; scala.reflect.classTag[C].runtimeClass"))
res2: Any = class __wrapper$1$f9d572ca0d884bca9333e251c64e980d$C$1

更新#1。 如果您不需要java.lang.Class中,只是需要实例编译的类,你可以写new C提交字符串中直接runExpr

更新#2。 也可能有runExpr使用自定义映射从变量名到运行时的值。 例如:

scala> val build = scala.reflect.runtime.universe.build
build: reflect.runtime.universe.BuildApi = scala.reflect.internal.BuildUtils$BuildImpl@50d5afff

scala> val x = build.setTypeSignature(build.newFreeTerm("x", 2), typeOf[Int])
x: reflect.runtime.universe.FreeTermSymbol = free term x

scala> tb.runExpr(Apply(Select(Ident(x), newTermName("$plus")), List(Literal(Constant(2)))))
res0: Any = 4

在这个例子中我创建具有为2的值的自由项(该值不必是一个原始的 - 它可以是自定义的对象)以及标识符绑定到它。 然后,该值被用作-是在被编译和被工具箱运行代码。

该示例使用手册AST组装,但它是可以编写解析字符串,发现了绑定标识,查找他们值某种映射函数,然后创建相应的免费条款。 有没有在斯卡拉2.10.0没有这样的功能,但。



文章来源: Generating a class from string and instantiating it in Scala 2.10