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

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

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

与 sschaef 的回答基本相同,只是您应该直接从标签中使用镜像,而不是使用当前类的类加载器的镜像。如果当前类和你有标签的其他类使用不同的类加载器,在这种情况下你会遇到类加载错误,但按照我解释的方式没有错误。

clazz变量将为您尝试获取的任何内容保存 java 类。

于 2015-07-05T02:46:16.327 回答