如何在Scala中获取动态创建的类的完整类名

时间:2016-12-07 05:56:44

标签: scala reflection runtime-compilation scala-compiler

我有一种情况,我必须获得我在Scala中动态生成的类的完全限定名称。这是我到目前为止所拥有的。

import scala.reflect.runtime.universe
import scala.tools.reflect.ToolBox

val tb = universe.runtimeMirror(getClass.getClassLoader).mkToolBox()

val generatedClass = "class Foo { def addOne(i: Int) = i + 1 }"
tb.compile(tb.parse(generatedClass))

val fooClass:String = ???

显然,这只是一个玩具示例,但我不知道如何获得Foo的完全限定名称。我尝试将包声明粘贴到代码中,但在调用tb.compile时出现错误。

有没有人知道如何获得完全限定的类名或(甚至更好)指定Foo编译的包?

由于

修改

使用建议的解决方案后,我能够获得类名。但是,下一步是注册此类以便稍后执行某些操作。具体来说,我正在尝试利用Apache Spark中的UDTRegistration来处理我自己的自定义UserDefinedType。当我手动创建所有类型时,此策略正常工作,但是,我想使用它们来扩展我可能不知道的其他类型。

在阅读this之后,似乎我正在尝试使用反射在运行时编译的代码。也许更好的解决方案是使用Scala宏,但我对该领域很新。

1 个答案:

答案 0 :(得分:2)

您可以使用define代替compile来生成新类并获取其包

val cls = tb.define(tb.parse(generatedClass).asInstanceOf[universe.ImplDef])
println(cls.fullName) //__wrapper$1$d1de39015284494799acd2875643f78e.Foo