還有兩個重要 Scala 工具,在你開發 Scala 程式時有很大的幫助,那就是 scalap 與 scaladoc。
看到這個兩個名稱,熟 Java 的朋友應該很容易對應到 Java 的工具,沒錯,這兩個工具就是對應 Java 世界中的 javap 與 javadoc。
javadoc 大部分的朋友比較熟悉,這裡不說明。但對於 javap 或許有比較多的人比較不曉得,值得介紹給大家認識。
javap 可以將 javac compile 後的 classfile 反組譯回來,讓你知道該 classfile 所包含的資訊,你可使用 javap 看到 class 包含哪些欄位、method、甚至可以看到程式碼 (JVM instruction),對於瞭解 Java 執行的流程,有相當多的幫助。以下用例子說明
1.撰寫 java source code並compile
2.使用 javap 查看 J1 所編譯出來的結果
若是你瞭解JVM instruction,可加-c (disassembly)的 optin,展開 method 中的 JVM instruction。JVM instruction 是 JVM 中的 assembly language。
3.使用javap來反組譯classfile
你看到什麼了?很棒吧,所有的程式碼都 show 給你看,你也可以從 javap 看到 javac 幫你產生哪些 method。
這個例子中 J1 並沒有宣告 constructor,但 javac 幫你產生 default constructor,名稱就叫 J1()。
你若喜歡,也可以使用 javap 來幫你查看 scalac 所 compile 出來的 classfile,讓我們現在就來試試。
4.使用 javap 來反組譯 scalac 所產生的 classfile
看到了吧,我們使用 javap 將 Scala 所產生的 classfile 一五一十顯示出來,很方便。
讓我們回到 Scala 的工具。 Scala 中的 scalap 的目的與 javap 類似,也是讓我們可以觀看compile後所產生的classfile,現在讓我們看看執行 scalap 會顯示什麼?
注意:在執行 scalap 之前,你需要將 scalap.jar 放到 classpath 中,否則會產生問題
5.使用 scalap 觀看 scalac 所產生的 classfile
scalap 顯示 class中的 field 與 method,可供你大致瞭解該 classfile 是如何。
scalap 並不重複 javap 所作的工作,但它會嘗試把該 classfile 當成 scalac 所產生來解譯,雖然該classfile 是由 javac 所產生。
讓我們現在來試試看。
6.使用 scalap 觀看 javac 所產生的 classfile
看到了,但好像有問題,J1竟然由 scala.AnyRef 繼承下來?有錯吧?!
其實,scalap 並沒有錯誤,在這裡反而我們可以察覺 Scala 的作用方式。AnyRef(現在不知道沒關係)其實直接對應到 Java 的 Object,
說清楚一點,Scala 中的 AnyRef 在內部運作時直接使用 Java 的 Object。嗯嗯,還是不懂,先不管 AnyRef 了,後面我們會討論到的。
這篇的說明讓我們了解到可以使用 javap、scalap 觀察 scalac 所產生的 classfile,二者都是很重要的工具,對於瞭解 Scala 如何與 Java 攜手合作是非常好的觀察工具,建議大家要好好善用這兩個工具。
沒有留言:
張貼留言