2016-12-07 135 views
3

我有一种情况,我必须获取在Scala中动态生成的类的完全限定名称。这是迄今为止我所拥有的。如何在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 = ??? 

显然,这仅仅是一个玩具的例子,但我只是不知道如何让富的全名。我试图将一个包装声明粘贴到代码中,但在致电tb.compile时发生错误。

有谁知道如何获取完全限定的类名或(甚至更好)来指定Foo编译下的包?

感谢

编辑

使用该解决方案后,提出我能得到的类名。然而,下一步就是这个班稍后再进行一些操作。具体而言,我试图在Apache Spark中使用UDTRegistration来处理我自己定制的UserDefinedType。这个策略在我手动创建所有类型时工作正常,但是,我想用它们来扩展我可能不知道的其他类型。

在阅读this之后,似乎我想要做的事可能无法使用运行时使用反射编译的代码。也许更好的解决方案是使用Scala宏,但我对这个领域非常陌生。

回答

2

您可以使用define代替compile生成新的类,并得到其包装

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

这是完美的,但我意识到,我的问题是不够的。我编辑了这个问题以反映我的新需求。 – Jon