gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:19:22 25 4
gpt4 key购买 nike

我有一种情况,我必须获得我在 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 在其下编译的包?

谢谢

编辑

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

看完this似乎我正在尝试做的事情可能无法使用在运行时使用反射编译的代码。也许更好的解决方案是使用 Scala 宏,但我对那个领域还很陌生。

最佳答案

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

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

关于scala - 如何在 Scala 中获取动态创建类的完整类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41010386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com