20

これは私を近づけるように見えますが、(a)完全ではありません(以下を参照)、および(b)名前の文字列表現を使用することはハックのように感じます...

scala> import scala.reflect.runtime.universe._import scala.reflect.runtime.universe._

scala> val t = typeOf[Int]
t: reflect.runtime.universe.Type = Int

scala> t.typeSymbol.asClass.fullName
res0: String = scala.Int

scala> object X { class Y } 
defined module X

scala> val y = typeOf[X.Y]
y: reflect.runtime.universe.Type = X.Y

scala> Class.forName(y.typeSymbol.asClass.fullName)
java.lang.ClassNotFoundException: X.Y [...]

この情報にアクセスするためのより直接的な方法がありませんか?それとも、Javaクラス情報の並列セットを保持するためだけに、ある時点でクラス情報も必要な場合は、それが最善でしょうか?(うーん!)

4

2 に答える 2

27

リフレクションを使用したオブジェクトの受信java.lang.Classまたはインスタンス化は、Scalaのコンパイル時情報であるタイプやシンボルではなく、ミラーを使用して実行する必要があります。

scala> val m = runtimeMirror(getClass.getClassLoader)
m: reflect.runtime.universe.Mirror = JavaMirror with ...

scala> m.runtimeClass(typeOf[X.Y].typeSymbol.asClass)
res25: Class[_] = class X$Y
于 2012-10-15T19:45:23.210 に答える
6

tagJavaクラスを取得したいクラスのタイプタグであると仮定すると、次のように言うことができます。

val mirror = tag.mirror
val clazz = mirror.runtimeClass(tag.tpe.typeSymbol.asClass)

現在のクラスのクラスローダーのミラーを使用する代わりに、タグから直接ミラーを使用する必要があることを除いて、基本的にsschaefの回答と同じです。現在のクラスと、異なるクラスローダーを使用するためのタグを持つ他のクラスの場合、その場合はクラスローディングエラーが発生しますが、説明した方法ではエラーは発生しません。

変数は、clazz取得しようとしているものすべてのJavaクラスを保持します。

于 2015-07-05T02:46:16.327 に答える