我有一个情况,必须在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来处理我自己的自定义UserDefinedTypes。当我手动创建所有类型时,此策略正常工作,但是,我想使用它们扩展我可能不知道的其他类型。
阅读本文后,使用反射在运行时编译的代码似乎无法做到的事情。也许更好的解决方案是使用Scala宏,但我对该区域非常新。
您可以使用define
而不是compile
生成新类并获得其软件包
val cls = tb.define(tb.parse(generatedClass).asInstanceOf[universe.ImplDef])
println(cls.fullName) //__wrapper$1$d1de39015284494799acd2875643f78e.Foo