生活随笔
收集整理的這篇文章主要介紹了
深入Java虚拟机:Class文件实例解析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前面發了幾篇學習筆記,但是看這些東西總是感覺很"玄乎",來一篇實戰的東西來揭一下"JVM"的面紗,讓"SSH"時代的童鞋們來熟悉一下Java的"老祖爺"JVM。由于自己的水平有限,所以大家在看過程中發了什么問題,或者您有什么疑問請及時提出來,我及時解決。如果您有什么建議,那么更好大家一塊討論。
1、源碼文件
public?class?LearningClassFile?{ ??????????private?int?id1; ??????????private?static?int?id2; ??????????private?final?int?id3?=?4; ??????????private?static?final?int?id4?=?5; ?????????? ?????public?LearningClassFile()?{ ?????} ?????? ?????public?LearningClassFile(int?id1,?int?id2)?{ ?????????this.id1?=?id1; ?????????this.id2?=?id2; ?????} ?????? ??????????public?void?addPub(int?a,?int?b)?{ ?????????int?result?=?a?+?b; ?????????System.out.println(result); ?????} ?????? ??????????private?void?addPri(int?a,?int?b)?{ ?????????int?result?=?a?+?b; ?????????System.out.println(result); ?????} ?????? ??????????public?static?void?addSta()?{ ?????????int?result?=?id2?+?id4; ?????????System.out.println(result); ?????} ?????? ?????public?static?final?void?addFinal(int?a,?int?b)?{ ?????????int?result?=?a?+?b; ?????????System.out.println(result); ?????} ?????? ?????public?static?void?main(String[]?args)?{ ?????????LearningClassFile?lcf?=?new?LearningClassFile(1,?2); ?????????lcf.addPub(1,?2); ?????????lcf.addPri(1,?2); ?????????addSta(); ?????????addFinal(1,?2); ?????} ?}?
Class文件:
Compiled?from?"LearningClassFile.java"?public?class?LearningClassFile?extends?java.lang.Object ???SourceFile:?"LearningClassFile.java"???minor?version:?0???major?version:?50????Constant?pool: ???const?#1?=?Method???????#13.#35;???????????????const?#2?=?Field????????#7.#36;??const?#3?=?Field????????#7.#37;??const?#4?=?Field????????#7.#38;??????const?#5?=?Field????????#39.#40;?????????tream; ???const?#6?=?Method???????#41.#42;??????????const?#7?=?class????????#43;???????const?#8?=?Method???????#7.#44;??????const?#9?=?Method???????#7.#45;??const?#10?=?Method??????#7.#46;??const?#11?=?Method??????#7.#47;??const?#12?=?Method??????#7.#48;??const?#13?=?class???????#49;?????const?#14?=?Asciz???????id1; ?const?#15?=?Asciz???????I; ?const?#16?=?Asciz???????id2; ?const?#17?=?Asciz???????id3; ???const?#18?=?Asciz???????ConstantValue; ??const?#19?=?int?4; ?const?#20?=?Asciz???????id4; ?const?#21?=?int?5; ?const?#22?=?Asciz???????<init>; ?const?#23?=?Asciz???????()V; ???const?#24?=?Asciz???????Code; ??const?#25?=?Asciz???????LineNumberTable; ?const?#26?=?Asciz???????(II)V; ?const?#27?=?Asciz???????addPub; ?const?#28?=?Asciz???????addPri; ?const?#29?=?Asciz???????addSta; ?const?#30?=?Asciz???????addFinal; ?const?#31?=?Asciz???????main; ?const?#32?=?Asciz???????([Ljava/lang/String;)V; ??const?#33?=?Asciz???????SourceFile; ?const?#34?=?Asciz???????LearningClassFile.java; ?const?#35?=?NameAndType?#22:#23;?const?#36?=?NameAndType?#17:#15;?const?#37?=?NameAndType?#14:#15;?const?#38?=?NameAndType?#16:#15;?const?#39?=?class???????#50;?????const?#40?=?NameAndType?#51:#52;?const?#41?=?class???????#53;?????const?#42?=?NameAndType?#54:#55;?const?#43?=?Asciz???????LearningClassFile; ?const?#44?=?NameAndType?#22:#26;?const?#45?=?NameAndType?#27:#26;?const?#46?=?NameAndType?#28:#26;?const?#47?=?NameAndType?#29:#23;?const?#48?=?NameAndType?#30:#26;?const?#49?=?Asciz???????java/lang/Object; ?const?#50?=?Asciz???????java/lang/System; ?const?#51?=?Asciz???????out; ?const?#52?=?Asciz???????Ljava/io/PrintStream;; ?const?#53?=?Asciz???????java/io/PrintStream; ?const?#54?=?Asciz???????println; ?const?#55?=?Asciz???????(I)V; ?? ?{ ??public?LearningClassFile(); ???Code: ????Stack=2,?Locals=1,?Args_size=1????0:???aload_0???? ????1:???invokespecial???#1;?????????4:???aload_0 ????????5:???iconst_4 ????????6:???putfield????????#2;?????9:???return???LineNumberTable: ????line?11:?0????????????????????????line?7:?4????????line?12:?9????? ?? ?public?LearningClassFile(int,?int); ???Code: ????Stack=2,?Locals=3,?Args_size=3????0:???aload_0 ????1:???invokespecial???#1;?????4:???aload_0 ????5:???iconst_4 ????6:???putfield????????#2;?????9:???aload_0 ????10:??iload_1 ????11:??putfield????????#3;?????14:??aload_0 ????15:??pop ????16:??iload_2 ????17:??putstatic???????#4;?????20:??return???LineNumberTable: ????line?14:?0??????????????????????????line?7:?4?????????line?15:?9????????line?16:?14???????line?17:?20????? ?? ?public?void?addPub(int,?int); ???Code: ????Stack=2,?Locals=4,?Args_size=3????0:???iload_1 ????1:???iload_2 ????2:???iadd ????3:???istore_3 ????4:???getstatic???????#5;?????7:???iload_3 ????8:???invokevirtual???#6;?????11:??return???LineNumberTable: ????line?21:?0????????line?22:?4????????line?23:?11????? ?? ?public?static?void?addSta(); ???Code: ????Stack=2,?Locals=1,?Args_size=0????????0:???getstatic???????#4;?????????3:???iconst_5 ????????4:???iadd ????????5:???istore_0 ????????6:???getstatic???????#5;?????????9:???iload_0 ????????10:??invokevirtual???#6;?????????13:??return???LineNumberTable: ????line?33:?0????????line?34:?6????????line?35:?13????? ?? ?public?static?final?void?addFinal(int,?int); ???Code: ????Stack=2,?Locals=3,?Args_size=2????0:???iload_0 ????1:???iload_1 ????2:???iadd ????3:???istore_2 ????4:???getstatic???????#5;?????7:???iload_2 ????8:???invokevirtual???#6;?????11:??return???LineNumberTable: ????line?38:?0????line?39:?4????line?40:?11?? ?? ?public?static?void?main(java.lang.String[]); ???Code: ????Stack=4,?Locals=2,?Args_size=1????????0:???new?????#7;?????????????3:???dup ????????4:???iconst_1 ????5:???iconst_2 ????????6:???invokespecial???#8;?????????9:???astore_1 ????10:??aload_1 ????11:??iconst_1 ????12:??iconst_2 ????????13:??invokevirtual???#9;?????16:??aload_1 ????17:??iconst_1 ????18:??iconst_2 ????19:??invokespecial???#10;?????????22:??invokestatic????#11;?????25:??iconst_1 ????26:??iconst_2 ????27:??invokestatic????#12;?????30:??return???LineNumberTable: ????line?43:?0?????????line?44:?10????????line?45:?16????????line?46:?22????????line?47:?25????????line?48:?30?????} ?
final變量和static final變量的區別:
(1)實例常量和類常量的區別
(2)初識方式不同:從class字節碼來看final修飾的變量會出現在每個構造方法中進行一次初始化;static final類型的變量必須在定義的時候進行初始化。 理解"編譯期可知,運行期不變": 編譯器可確定調用方法的版本,符合這個標準的方法主要有兩種:私有方法,靜態方法。
詳情請看:深入理解JVM讀書筆記--字節碼執行引擎。
2、final變量和static final變量的區別:
(1)實例常量和類常量的區別
(2)初始化方式不同:從class字節碼來看final修飾的變量會出現在每個構造方法中進行一次初始化;static final類型的變量必須在定義的時候進行初始化。
3、理解"編譯期可知,運行期不變":
編譯器可確定調用方法的版本,符合這個標準的方法主要有兩種:私有方法,靜態方法。
總結
以上是生活随笔為你收集整理的深入Java虚拟机:Class文件实例解析的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。