从Scala(2.10)类型标记或符号获取Java类的任何方法?

时间:2012-10-15 18:33:10

标签: scala reflection scala-2.10

看起来这让我很接近,但是(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类信息? (唉!)

2 个答案:

答案 0 :(得分:26)

接收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

答案 1 :(得分:4)

假设tag是您想要获取java类的类的类型标记,您可以说:

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

基本上和sschaef的答案一样,除了你应该直接从标签使用镜像,而不是使用当前类的镜像'类加载器。如果当前类和你拥有标记的其他类使用不同的类加载器,那么在这种情况下你会遇到类加载错误,但是我解释的方式没有错误。

clazz变量将保存java类,无论你想要获得什么。