2010-09-24 6 views
14

Folgende Scala-Mailinglisten sagen oft: "Der Compiler schreibt diesen [scala] -Code in diesen [java/scala ?? ] Code ". Zum Beispiel von einem der neuesten Threads, wenn Scala siehtWie kann ich sehen, in welchem ​​[Java/Scala?] - Code der Scala-Compiler den ursprünglichen Scala-Code umschreibt?

class C(i: Int = 4) { ... } 

dann der Compiler schreibt dies als (effektiv):

class C(i: Int) { ... } 
object C { 
    def init$default$1: Int = 4 
} 

Wie kann ich herausfinden, was der Compiler ausgegeben werden für mein Code? Soll ich den resultierenden Bytecode dafür dekompilieren?

+2

Scala-Compiler auf dem erzeugten Bytecode sieht nicht den Code in Java-Code neu schreiben, aber Scala-Code in Java-Bytecode kompiliert, die anders ist. Vielleicht können Sie diesen Bytecode (mit Jad) beispielsweise "zurückentwickeln", um einen Java-Quellcode zu erhalten. –

+1

Ich weiß, dass Scala-Compiler [in einigen Fällen] ursprünglichen Code neu schreibt. Ich habe jetzt meine ursprüngliche Frage korrigiert. –

Antwort

13

Sie können "-print" als Compileroption verwenden und scalac wird alle Scala-spezifischen Funktionen entfernen.

Zum Beispiel, hier ist der ursprüngliche Code:

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") 
    } 
} 

Und wenn Sie „scalac -Druck“ verwenden, es zu kompilieren, wird die folgende Scala-Code.

[[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(); 
    () 
    } 
    } 
} 
7

Man kann mit

javap -c -private ClassNameWithoutDotClass 
Verwandte Themen