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

3

我有一个情况,需要在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。 当我手动创建所有类型时,此策略运行良好,但是我想将它们用于扩展其他可能不知道的类型。

阅读此文后,似乎我尝试使用反射在运行时编译的代码可能无法实现我的目标。 也许更好的解决方案是使用Scala宏,但我对这个领域非常陌生。

1个回答

2

您可以使用define而不是compile来生成新的类并获得其包

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

这很完美,但我意识到我的问题不够充分。我已经编辑了问题以反映我的新需求。 - Jon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接