在关注Scala邮件列表时,不同的人经常会说:“编译器将此[scala]代码重写为此[java/scala??]代码”。例如,在最新的一个线程中,如果Scala看到:
class C(i: Int = 4) { ... }
那么编译器会将其重写为(实际上):
class C(i: Int) { ... }
object C {
def init$default$1: Int = 4
}
我该如何找出编译器针对我的代码将生成什么输出?我需要反编译生成的字节码吗?
在关注Scala邮件列表时,不同的人经常会说:“编译器将此[scala]代码重写为此[java/scala??]代码”。例如,在最新的一个线程中,如果Scala看到:
class C(i: Int = 4) { ... }
那么编译器会将其重写为(实际上):
class C(i: Int) { ... }
object C {
def init$default$1: Int = 4
}
我该如何找出编译器针对我的代码将生成什么输出?我需要反编译生成的字节码吗?
class Main
{
def test (x: Any) = x match {
case "Hello" => println ("Hello World")
case e: String => println ("String")
case i: Int => println ("Int")
case _ => println ("Something else")
}
}
如果您使用"scalac -print"编译它,将会得到以下的Scala代码。
[[syntax trees at end of cleanup]]// Scala source: Test.scala
package <empty> {
class Main extends java.lang.Object with ScalaObject {
def test(x: java.lang.Object): Unit = {
<synthetic> val temp1: java.lang.Object = x;
if (temp1.==("Hello"))
{
scala.this.Predef.println("Hello World")
}
else
if (temp1.$isInstanceOf[java.lang.String]())
{
scala.this.Predef.println("String")
}
else
if (temp1.$isInstanceOf[Int]())
{
scala.this.Predef.println("Int")
}
else
{
scala.this.Predef.println("Something else")
}
};
def this(): Main = {
Main.super.this();
()
}
}
}
可以使用以下方法查看生成的字节码:
javap -c -private ClassNameWithoutDotClass