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)
假设tag是您要为其获取Java类的类的类型标记,您可以说:
val mirror = tag.mirror
val clazz = mirror.runtimeClass(tag.tpe.typeSymbol.asClass)
Run Code Online (Sandbox Code Playgroud)
基本上与sschaef的答案相同,除了您应该直接从标记中使用镜像,而不是使用当前类的类加载器的镜像。如果当前类和您具有标记要使用的其他类使用不同的类加载器,则在这种情况下,将有类加载错误,但按照我的解释没有错误。
该clazz变量将保留您要获取的任何内容的java类。
| 归档时间: |
|
| 查看次数: |
6642 次 |
| 最近记录: |