我有
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