2016-12-07 2 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 = ??? 

これは単なるおもちゃの例ですが、Fooの完全修飾名を取得する方法はわかりません。コードにパッケージ宣言を貼り付けようとしましたが、tb.compileを呼び出すときにエラーがスローされました。

完全に修飾されたクラス名を取得する方法、またはFooがコンパイルするパッケージを指定する方法を知っている人はいますか?

おかげ

EDIT

ソリューションを使用した後、私はクラス名を取得することができた提案。しかし、次のステップは、後でいくつかのアクションを取るためにこのクラスを登録することです。具体的には、自分のカスタムUserDefinedTypeを処理するためにApache Spark内でUDTRegistrationを使用しようとしています。この戦略は、すべてのタイプを手動で作成する場合にはうまく動作しますが、それらを使用して私が知り得ない他のタイプを拡張したいと考えています。

thisを読んだあと、実行時にリフレクションを使用してコンパイルされたコードを使用して、私がしようとしているように見えないようです。おそらく、Scalaマクロを使用する方が良い解決策になるかもしれませんが、私はその分野では非常に新しいです。

答えて

2

あなたは新しいクラスを生成し、

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

そのパッケージを取得する代わりにcompiledefineを使用することがありますが、これは完璧ですが、私は私の質問には不十分であったことに気づきました。私は新しいニーズを反映するために質問を編集しました。 – Jon

関連する問題