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

Tim*_*Tim 19 reflection scala 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 [...]
Run Code Online (Sandbox Code Playgroud)

我错过了一些更直接的方法来访问这些信息吗?或者它是最好的,如果我在某些时候也需要类信息,只是为了保持一组并行的Java类信息?(啊!)

kir*_*uku 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
Run Code Online (Sandbox Code Playgroud)

  • 已经从RC1中删除了"ClassMirror.runtimeClass"功能,因为有一个更短的选择:只有`m.runtimeClass(typeOf [XY] .typeSymbol.asClass)`. (4认同)

Ang*_*nco 5

假设tag是您要为其获取Java类的类的类型标记,您可以说:

val mirror = tag.mirror
val clazz = mirror.runtimeClass(tag.tpe.typeSymbol.asClass)
Run Code Online (Sandbox Code Playgroud)

基本上与sschaef的答案相同,除了您应该直接从标记中使用镜像,而不是使用当前类的类加载器的镜像。如果当前类和您具有标记要使用的其他类使用不同的类加载器,则在这种情况下,将有类加载错误,但按照我的解释没有错误。

clazz变量将保留您要获取的任何内容的java类。