我最近遇到了scala.reflect.runtime API并试图通过Stringevaluation生成Classdefinitins。 这是我在scala REPL中的方法:
scala> import scala.reflect.runtime._
import scala.reflect.runtime._
scala> val cm = universe.runtimeMirror(getClass.getClassLoader)
cm: reflect.runtime.universe.Mirror = JavaMirror with scala.tools.n[....]
scala> import scala.tools.reflect.ToolBox
import scala.tools.reflect.ToolBox
scala> val tb = cm.mkToolBox()
tb: scala.tools.reflect.ToolBox[reflect.runtime.universe.type] = scala.to[...]
scala> tb.eval(tb.parse("class A; scala.reflect.classTag[A].runtimeClass"))
res0: Any = class __wrapper$1$c6a9fb3f39c2499a9ff6e29384816f58.__wrapper$[...]
由于REPL的回答不是:
定义了A类
但是
res0:任何=类 __wrapper $ 1 $ c6a9fb3f39c2499a9ff6e29384816f58 .__包装$ [...]
我开始怀疑我是否真的创建了一个类或者只是初始化了一个抽象的Any实例? 我曾经读过scala,一切都是一个对象。如果我的REPL中的res0现在实际上拥有一个类,那么这意味着,甚至类都是scala中的对象?但这是我无法找到更多输入,所以我真的很困惑。 如果类不是scala中的对象,那么res0实际上在什么时候持有什么? 提前感谢您的帮助。
答案 0 :(得分:2)
不,类不是严格意义上的对象,也不是方法。 Scala在JVM上运行,Scala类和方法编译为JVM的概念。
通常意味着"一切都是对象"每个值都是一个对象,即本机值,实例,函数。
但是,有些对象可以让您访问类和方法的元信息。如果你这样做
res0.getClass
您将看到,res0是(Java)类Class的一个实例。所以你刚刚从JVM反射API获得了一个对象。
REPL没有给你一个"定义的A"因为你已经在其他环境中定义了它。
顺便说一下,您可以写scala.reflect.classTag[A].runtimeClass
而不是classOf[A]
。