1. 程式人生 > >從jvm來看,scala中的@究竟是個什麼鬼?@模式匹配符號(scala 詞法分析 語法分析 常用)

從jvm來看,scala中的@究竟是個什麼鬼?@模式匹配符號(scala 詞法分析 語法分析 常用)

從jvm來看,scala中的@究竟是個什麼鬼? 我也是初步嘗試來看jvm的類檔案,又是初次來分析@,如不對的地方,請各位指正!

先看一下@ 是個什麼?

/**
  * Created by admin on 2016/12/29.
  */
object test7 {
  def main(args: Array[String]) {
    val b=Some(2)
    val [email protected]Some(1)  =  Some(1)
    println(b)
    println(a)

    val bb= 2
val [email protected]
"IMF" ="IMF" println(bb) println(aa) } }

執行結果:

"C:\Program Files\Java\jdk1.8.0_65\bin\java" -Didea.launcher.port=7541 "-Didea.launcher.bin.path=..... com.intellij.rt.execution.application.AppMain test7
Some(2)
Some(1)
2
IMF


Process finished with exit code 0

 

但 @在idea中原始碼中點選不開,既不是 函式,也不是運算子,那scala中編譯後究竟是什麼呢 ?能否 從JVM來看看 ?

1,寫2個scala檔案,一個包含@,一個不包含@

TestNoOpera.scala 不包含@

object TestNoOpera {
  def main(args: Array[String]) {
    val b="IMF"
  }
}

TestInludeOpera.scala  包含@

object TestInludeOpera {
  def main(args: Array[String]) {
   val [email protected]"IMF" ="IMF"
  }
}

2,scalac 編譯成class檔案.


3,從 class類檢視工具java class viewer分別看一下 TestInludeOpera$.class 和 TestNoOpera$.class檔案 

 3.1:TestNoOpera$.class檔案 



說明:

opcode [12] - 0000: ldc 16 [String: IMF]  //ldc指令從執行時常量池中載入字串常量 “IMF” (常量池中16的位置,字串索引為15,名稱為IMF),並把IMF推入到JVM的運算元棧。
opcode [4D] - 0002: astore_2 //astore指令把IMF變數從運算元棧頂彈出,存入區域性變量表。a意思是操作引用型別。
opcode [B1] - 0003: return  // 什麼也沒有做,那就return指令返回,沒有返回值。將結果返回給呼叫方。

3.2TestInludeOpera$.class  包含@操作符的類檔案


opcode [12] - 0000: ldc 16 [String: IMF]//ldc指令從執行時常量池中載入字串常量 “IMF” (常量池中16的位置,字串索引為15,名稱為IMF),並把IMF推入到JVM的運算元棧。
opcode [4E] - 0002: astore_3  //astore指令把IMF變數從運算元棧頂彈出,存入區域性變量表的欄位3。
opcode [12] - 0003: ldc 16 [String: IMF] //ldc指令從執行時常量池中載入字串常量 “IMF” ,並把IMF推入到JVM的運算元棧。
opcode [2D] - 0005: aload_3   //aload 從區域性變量表又取出了 IMF變數,將IMF變數推入到運算元棧頂
opcode [3A] - 0006: dstore 4 //dstore 指令將變數IMF從運算元棧頂彈出,存到到區域性變量表的欄位4 .
opcode [59] - 0008: dup //dup複製運算元棧頂的變數IMF
opcode [C7] - 0009: ifnonnull 12 //ifnonnull判斷值是否為空
opcode [57] - 0012: pop     // pop指令對運算元棧進行操作,將棧頂的變數IMF彈出 
opcode [19] - 0013: aload 4  //aload 從區域性變量表的欄位4 取出了 IMF變數,將IMF變數推入到運算元棧頂
opcode [C6] - 0015: ifnull 14 //ifnnull判斷值是否為空
opcode [A7] - 0018: goto 19 //無條件跳轉到偏移量19的位置 
opcode [19] - 0021: aload 4 //aload 從區域性變量表的欄位4 取出了 IMF變數,將IMF變數推入到運算元棧頂
opcode [B6] - 0023: invokevirtual 20 [Methodref: java.lang.Object.equals, parameter = (java.lang.Object), returns = boolean ] //invokevirtual 指令從物件的類中查詢要呼叫的方法,如果找不到方法,就報異常,這裡是呼叫Object的equals方法,入引數是物件,返回值是布林值
opcode [99] - 0026: ifeq 11 //判定是否相等 
opcode [12] - 0029: ldc 16 [String: IMF] // //ldc指令從執行時常量池中載入字串常量 “IMF” ,並把IMF推入到JVM的運算元棧。
opcode [3A] - 0031: dstore 5 ///dstore 指令將變數IMF從運算元棧頂彈出,存到到區域性變量表的欄位5
opcode [19] - 0033: aload 5 // //aload 從區域性變量表取出了 IMF變數,將IMF變數推入到運算元棧頂
opcode [4D] - 0035: astore_2 // //astore指令把IMF變數從運算元棧頂彈出,存入區域性變量表的欄位2。
opcode [B1] - 0036: return // return返回

//以下是異常的處理
opcode [BB] - 0037: name_new 22 [Class: scala.MatchError] //new指令的運算元是一個unit16的索引,這裡是22,我們通過這個索引 ,從類的執行時常量池中找到類符號引用 ,解析這個類符合引號,那就可以拿到類資料,建立物件,並且將物件引用推入到運算元棧頂,new指令完成.
opcode [59] - 0040: dup  //dup複製運算元棧頂的變數MatchError
opcode [2D] - 0041: aload_3 //aload 從區域性變量表取出了 IMF變數,將IMF變數推入到運算元棧頂
opcode [B7] - 0042: invokespecial 25 [Methodref: scala.MatchError.<init>, parameter = (java.lang.Object), returns = void] //invokespecial 呼叫MatchError方法
opcode [BF] - 0045: athrow //athrow是引用類指令,將MatchError異常物件引用從運算元棧頂彈出,並跳轉到異常處理程式碼.


四:結論:

@符號在scala編譯中做了一個模式配置的工作,將字串做了比對,如果值相等,將將這個值取到賦值給變數;如果值不相等,匹配不上,就報一個異常.

相關推薦

jvm來看scala的@究竟什麼?@模式匹配符號(scala 詞法分析 語法分析 常用)

從jvm來看,scala中的@究竟是個什麼鬼? 我也是初步嘗試來看jvm的類檔案,又是初次來分析@,如不對的地方,請各位指正! 先看一下@ 是個什麼? /** * Created by admin on 2016/12/29. */ object test7 {

VS程式設計WPF滾動條 ScrollViewer 同步滾動的一種方法

這裡以兩個ScrollViewer控制元件之間的同步滾動為例。 當滑鼠拖動其中一個滾動條時,另一個滾動條跟著一起調整到相應的位置。   1、前臺建立兩個ScrollViewer控制元件,並分別給兩個滾動條控制元件命名。 <Stack

Scala 10 超讚的集合操作函式

當我處理 Scala 集合時,我會進行兩類操作:轉換操作和聚合操作。第一種操作型別將集合轉換為另一個集合,第二種操作型別返回某些型別的值。 本文我將集中介紹幾個日常工作必備的 Scala 集合函式,如轉換函式和聚合函式。文章最後,我會展示如何結合這些函式以解決具體問題。

VS編程WPF滾動條 ScrollViewer 同步滾動的一種方法

9.png hid 聲明 class ESS 定義 如果 src 中一 原文:VS編程,WPF中兩個滾動條 ScrollViewer 同步滾動的一種方法

“芯”開始物聯網的通信模式正在悄悄改變

結構 ron 硬件 src 流量 原因 nbsp 除了 方式 從最開始的標準卡(SIM)、小卡(Micro SIM)再到超小卡(Nano SIM),不難發現,SIM卡一直在向“小”方向發展,而現在,運營商甚至推出了一種eSIM芯片。5月25日,中國移動推出首款自主品牌自主研

程式設計師辭職遭忽悠年終獎泡湯網友:信糟老頭子壞得很!

隨著日子一天一天的過去,離過春節的日子也是越來越近。公司都陸陸續續忙著開年會,員工們也是期待著自己的年終獎。 在網際網路這個行業,這個冬天真的就是“冬天”,前一段時間各個大廠相繼傳出裁員的訊息,雖然按照勞動法賠償了被裁的員工N+1,但其實,這些員工也拿不到最後的年終獎,可謂是“用心良苦”。

java事件監聽機制spring的event listener模式和解耦

event,listener是observer模式一種體現,在spring 3.0.5中,已經可以使用annotation實現event和eventListner裡。我們以spring-webflow裡的hotel booking為例,看一下實現,步驟如下:1,建立eve

話說模式匹配(2) scala裡是怎麼實現的?

在這篇martin和另外兩位模式匹配領域專家的論文裡說了模式匹配的幾種實現方式,以及scala是選擇哪種方式來實現的。 http://lampwww.epfl.ch/~emir/written/MatchingObjectsWithPatterns-TR.pdf 我引用了裡面的一些描述。 在面

話說模式匹配(4) scala裡的賦值語句都是模式匹配嗎?

先拋個問題,下面的語句是否都合理(編譯通過),哪些會引起模式匹配? scala> val a = 100 scala> val A = 100 scala> val [email protected] = 100 scala> val (a,b) =

scala習題(14)——模式匹配和樣例類

14.1 JDK發行包有一個src.zip檔案包含了JDK的大多數原始碼。解壓並搜尋樣例標籤(用正則表示式case [^:]+:)。然後查詢以//開頭幷包含[Ff]alls?thr的註釋,捕獲類似// Falls through或// just fall thr

[今天開始修煉資料結構]串、KMP模式匹配演算法

[從今天開始修煉資料結構]基本概念 [從今天開始修煉資料結構]線性表及其實現以及實現有Itertor的ArrayList和LinkedList [從今天開始修煉資料結構]棧、斐波那契數列、逆波蘭四則運算的實現 [從今天開始修煉資料結構]佇列、迴圈佇列、PriorityQueue的原理及實現 一、什麼是串?  

輸入兩整數n和m數列1,2,3……n隨意取幾個數使其和等於m 轉載

輸出 -1 pri str spa private 組合 開始 () 題目:編程求解,輸入兩個整數n和m,從數列1,2,3,……n中隨意取幾個數,使其和等於m。要求將所有的可能組合列出來。 分析:分治的思想。可以把問題(m,n)拆分(m - n, n -1)和(m, n -

n字符找出m排列組合

scan maxlength else include sizeof 排列組合 length char col 網上看到的版本 #include <string.h> #include <stdio.h> #include <stdlib.h

重定位載入地址一次複製4位元組到執行地址的問題

程式碼:  ldr r1,=bss_start      ldr r2,=bss_end    mov r3,#0  clean:    str r3,[r1]    

C語言輸入abc三整數大到小排序輸出和“找出三個數最大的數”的中間變數的用法的區別

共同點:都是中間變數,都可以重複拿來做中轉站使用 不同點:排序的題目中,中間變數只是做中轉站作兩個變數交換值用來,並不是要用來儲存最終要輸出的值              而找出最大數或者最小數的題目中,中間變數不但做交換用的中轉站,還要儲存程式最終要輸出的值     

(動態規劃)有 n 學生站成一排每個學生有一個能力值,從這 n 學生按照順序選取kk 名學生要求相鄰兩學生的位置編號的差不超過 d使得這 kk 學生的能力值的乘積最大返回最大的乘積

第2關:最強戰隊 挑戰任務 綠盟和各大名企合作,舉辦程式設計能力大賽,需要選拔一支參賽隊伍。隊伍成員全部來自“綠盟杯”中表現優秀的同學,每個同學都根據在比賽中的表現被賦予了一個能力值。現在被召集的N個同學已經集結完畢,他們按照編號依次站成了一排。 你需要編寫一個程式,從

第014講:ScalaMap和HashMap原始碼剖析及程式碼實踐(1000程式碼案例學習人工智慧和大資料實戰)

第014講:Scala中Map和HashMap原始碼剖析及程式碼實踐/** * A generic trait for immutable maps. Concrete classes have to provide * functionality for the abs

演算法--中興面試:輸入兩整數 n 和 m數列123.......n 隨意取幾個數, 使其和等於 m

Q題目 程式設計求解 輸入兩個整數 n 和 m,從數列1,2,3…….n 中隨意取幾個數, 使其和等於 m ,要求將其中所有的可能組合列出來. Answer解法 這道題就是一道典型的動態規劃問題了,思路和揹包問題差不多,m就相當於揹包能容納的

輸入兩整數n和m數列123...n隨意取幾個數使其和等於m將其所有可能的組合列出來。 遞迴求解

/* *[email protected] 轉載請註明出處 *問題:輸入兩個整數n和m,從數列1,2,3,...,n中隨意取幾個數, *使其和等於m,將其所有可能的組合列出來。 *求解思路:(遞迴求解) *(1)如果n>m則數列中>m的部分不可能參與組

程式設計求解輸入兩整數n和m,數列1,2,3……n隨意取幾個數使其和等於m。要求將所有的可能組合列出來(揹包問題求解) .

程式設計求解,輸入兩個整數n和m,從數列1,2,3,……n中隨意取幾個數,使其和等於m。要求將所有的可能組合列出來。實際上就是一個揹包問題。 求解思路: 1.首先判斷,如果n>m,則n中大於m的數不可能參與組合,此時置n = m; 2.將最大數n加入且n == m,則