Scala反射在解释器和编译代码上的行为是不同的



我有

trait T
class C extends T

编译成。class文件。下面这段代码用来加载它们:

val loader = ScalaClassLoader fromURLs (/* List[URL] */)
val classB = loader.tryToInitializeClass("B") getOrElse (/* throw something */)
println(classB.asInstanceOf[Class[_]].getInterfaces)
当我在Scala解释器中运行加载代码时,结果是
res1: Array[java.lang.Class[_]] = Array(interface T, interface scala.ScalaObject)

但是当加载代码编译成。class文件并运行时,我得到

[Ljava.lang.Class;@1b8e059

请告诉我如何使编译后的加载代码产生与解释器上一样好的结果。

您确定在解释会话中执行了println吗?因为您编写的第一个结果看起来很像解释器显示的结果classB.asInstanceOf[Class[_]].getInterfaces),没有println (res1很有说服力)

另一方面,模糊的[Ljava.lang.Class;@1b8e059是数组的toString。你的问题是toString。如果你用println(yourResult.mkString(", "))这样的方法,效果会好得多。在REPL中,结果显示优于普通的toString

Array(interface T, interface scala.ScalaObject)[Ljava.lang.Class;@1b8e059是同一类型的对象,只是打印方式不同。

Array[Class[_]]在调用toString时输出为[Ljava.lang.Class;@1b8e059。

尝试以下操作:

scala> val f = Array[Class[_]](classOf[Map[String, String]], classOf[Object])
f: Array[java.lang.Class[_]] = Array(interface scala.collection.immutable.Map, class java.lang.Object)
scala> f.toString
res1: java.lang.String = [Ljava.lang.Class;@407e62

当REPL打印出表达式的值时,它是有用的。如果您想在编译后的代码中打印出有用的字符串,例如:

scala> f.toList.toString
res4: String = List(interface scala.collection.immutable.Map, class java.lang.Object)

res1: Array[java.lang.Class[_]] = Array(interface T, interface scala.ScalaObject)

不是来自您的println表达式,它来自REPL。如果输入的表达式返回Unit以外的任何值。REPL打印该对象的toString方法的名称、类型和结果。

name: Type = from toString

相关内容

  • 没有找到相关文章

最新更新