java class file及反汇编后的jvm指令

工程目录结构如下:

HStudy

--src

--jvm

--init

--classes

--jvm

--init

源码如下:

package jvm.init; public class Example5 { public static void main(String[] args) { int a = 2; int b = 3; if (args.length < 2) { System.out.println("Must enter any two args."); return; } System.out.println(args[0] + args[1]); } }

以下是在命令行下的操作:

编译源码 E:\workspace_RIA\HStudy>javac -g -classpath classes -sourcepath src src\jvm\init\Example5.java -d classes

生成的class文件的16进制码如下:

00000000h: CA FE BA BE 00 00 00 31 00 30 0A 00 0A 00 1B 09 ; 漱壕...1.0...... 00000010h: 00 1C 00 1D 08 00 1E 0A 00 1F 00 20 07 00 21 0A ; ........... ..!. 00000020h: 00 05 00 1B 0A 00 05 00 22 0A 00 05 00 23 07 00 ; ........"....#.. 00000030h: 24 07 00 25 01 00 06 3C 69 6E 69 74 3E 01 00 03 ; $..%...<init>... 00000040h: 28 29 56 01 00 04 43 6F 64 65 01 00 0F 4C 69 6E ; ()V...Code...Lin 00000050h: 65 4E 75 6D 62 65 72 54 61 62 6C 65 01 00 12 4C ; eNumberTable...L 00000060h: 6F 63 61 6C 56 61 72 69 61 62 6C 65 54 61 62 6C ; ocalVariableTabl 00000070h: 65 01 00 04 74 68 69 73 01 00 13 4C 6A 76 6D 2F ; e...this...Ljvm/ 00000080h: 69 6E 69 74 2F 45 78 61 6D 70 6C 65 35 3B 01 00 ; init/Example5;.. 00000090h: 04 6D 61 69 6E 01 00 16 28 5B 4C 6A 61 76 61 2F ; .main...([Ljava/ 000000a0h: 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29 56 01 00 ; lang/String;)V.. 000000b0h: 04 61 72 67 73 01 00 13 5B 4C 6A 61 76 61 2F 6C ; .args...[Ljava/l 000000c0h: 61 6E 67 2F 53 74 72 69 6E 67 3B 01 00 01 61 01 ; ang/String;...a. 000000d0h: 00 01 49 01 00 01 62 01 00 0A 53 6F 75 72 63 65 ; ..I...b...Source 000000e0h: 46 69 6C 65 01 00 0D 45 78 61 6D 70 6C 65 35 2E ; File...Example5. 000000f0h: 6A 61 76 61 0C 00 0B 00 0C 07 00 26 0C 00 27 00 ; java.......&..'. 00000100h: 28 01 00 18 4D 75 73 74 20 65 6E 74 65 72 20 61 ; (...Must enter a 00000110h: 6E 79 20 74 77 6F 20 61 72 67 73 2E 07 00 29 0C ; ny two args...). 00000120h: 00 2A 00 2B 01 00 17 6A 61 76 61 2F 6C 61 6E 67 ; .*.+...java/lang 00000130h: 2F 53 74 72 69 6E 67 42 75 69 6C 64 65 72 0C 00 ; /StringBuilder.. 00000140h: 2C 00 2D 0C 00 2E 00 2F 01 00 11 6A 76 6D 2F 69 ; ,.-..../...jvm/i 00000150h: 6E 69 74 2F 45 78 61 6D 70 6C 65 35 01 00 10 6A ; nit/Example5...j 00000160h: 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 01 ; ava/lang/Object. 00000170h: 00 10 6A 61 76 61 2F 6C 61 6E 67 2F 53 79 73 74 ; ..java/lang/Syst 00000180h: 65 6D 01 00 03 6F 75 74 01 00 15 4C 6A 61 76 61 ; em...out...Ljava 00000190h: 2F 69 6F 2F 50 72 69 6E 74 53 74 72 65 61 6D 3B ; /io/PrintStream; 000001a0h: 01 00 13 6A 61 76 61 2F 69 6F 2F 50 72 69 6E 74 ; ...java/io/Print 000001b0h: 53 74 72 65 61 6D 01 00 07 70 72 69 6E 74 6C 6E ; Stream...println 000001c0h: 01 00 15 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 ; ...(Ljava/lang/S 000001d0h: 74 72 69 6E 67 3B 29 56 01 00 06 61 70 70 65 6E ; tring;)V...appen 000001e0h: 64 01 00 2D 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F ; d..-(Ljava/lang/ 000001f0h: 53 74 72 69 6E 67 3B 29 4C 6A 61 76 61 2F 6C 61 ; String;)Ljava/la 00000200h: 6E 67 2F 53 74 72 69 6E 67 42 75 69 6C 64 65 72 ; ng/StringBuilder 00000210h: 3B 01 00 08 74 6F 53 74 72 69 6E 67 01 00 14 28 ; ;...toString...( 00000220h: 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 ; )Ljava/lang/Stri 00000230h: 6E 67 3B 00 21 00 09 00 0A 00 00 00 00 00 02 00 ; ng;.!........... 00000240h: 01 00 0B 00 0C 00 01 00 0D 00 00 00 2F 00 01 00 ; ............/... 00000250h: 01 00 00 00 05 2A B7 00 01 B1 00 00 00 02 00 0E ; .....*?.?..... 00000260h: 00 00 00 06 00 01 00 00 00 03 00 0F 00 00 00 0C ; ................ 00000270h: 00 01 00 00 00 05 00 10 00 11 00 00 00 09 00 12 ; ................ 00000280h: 00 13 00 01 00 0D 00 00 00 86 00 04 00 03 00 00 ; .........?..... 00000290h: 00 30 05 3C 06 3D 2A BE 05 A2 00 0C B2 00 02 12 ; .0.<.=*??.?.. 000002a0h: 03 B6 00 04 B1 B2 00 02 BB 00 05 59 B7 00 06 2A ; .?.辈..?.Y?.* 000002b0h: 03 32 B6 00 07 2A 04 32 B6 00 07 B6 00 08 B6 00 ; .2?.*.2?.?.? 000002c0h: 04 B1 00 00 00 02 00 0E 00 00 00 1E 00 07 00 00 ; .?............. 000002d0h: 00 05 00 02 00 06 00 04 00 07 00 0A 00 08 00 12 ; ................ 000002e0h: 00 09 00 13 00 0C 00 2F 00 0D 00 0F 00 00 00 20 ; ......./....... 000002f0h: 00 03 00 00 00 30 00 14 00 15 00 00 00 02 00 2E ; .....0.......... 00000300h: 00 16 00 17 00 01 00 04 00 2C 00 18 00 17 00 02 ; .........,...... 00000310h: 00 01 00 19 00 00 00 02 00 1A ; ..........

反编译 E:\workspace_RIA\HStudy>javap -c -classpath classes jvm.init.Example5 -verbose

注意:不要在类后面加.class后缀,这儿与javac恰好相反

E:\workspace_RIA\HStudy>javac -g -classpath classes -sourcepath src src\jvm\init \Example5.java -d classes E:\workspace_RIA\HStudy>javap -c -classpath classes jvm.init.Example5 -verbose Compiled from "Example5.java" public class jvm.init.Example5 extends java.lang.Object SourceFile: "Example5.java" minor version: 0 major version: 49 Constant pool: const #1 = Method #10.#27; // java/lang/Object."<init>":()V const #2 = Field #28.#29; // java/lang/System.out:Ljava/io/PrintS tream; const #3 = String #30; // Must enter any two args. const #4 = Method #31.#32; // java/io/PrintStream.println:(Ljava/l ang/String;)V const #5 = class #33; // java/lang/StringBuilder const #6 = Method #5.#27; // java/lang/StringBuilder."<init>":()V const #7 = Method #5.#34; // java/lang/StringBuilder.append:(Ljava/lang/S tring;)Ljava/lang/StringBuilder; const #8 = Method #5.#35; // java/lang/StringBuilder.toString:()Ljava/lan g/String; const #9 = class #36; // jvm/init/Example5 const #10 = class #37; // java/lang/Object const #11 = Asciz <init>; const #12 = Asciz ()V; const #13 = Asciz Code; const #14 = Asciz LineNumberTable; const #15 = Asciz LocalVariableTable; const #16 = Asciz this; const #17 = Asciz Ljvm/init/Example5;; const #18 = Asciz main; const #19 = Asciz ([Ljava/lang/String;)V; const #20 = Asciz args; const #21 = Asciz [Ljava/lang/String;; const #22 = Asciz a; const #23 = Asciz I; const #24 = Asciz b; const #25 = Asciz SourceFile; const #26 = Asciz Example5.java; const #27 = NameAndType #11:#12;// "<init>":()V const #28 = class #38; // java/lang/System const #29 = NameAndType #39:#40;// out:Ljava/io/PrintStream; const #30 = Asciz Must enter any two args.; const #31 = class #41; // java/io/PrintStream const #32 = NameAndType #42:#43;// println:(Ljava/lang/String;)V const #33 = Asciz java/lang/StringBuilder; const #34 = NameAndType #44:#45;// append:(Ljava/lang/String;)Ljava/lang/String Builder; const #35 = NameAndType #46:#47;// toString:()Ljava/lang/String; const #36 = Asciz jvm/init/Example5; const #37 = Asciz java/lang/Object; const #38 = Asciz java/lang/System; const #39 = Asciz out; const #40 = Asciz Ljava/io/PrintStream;; const #41 = Asciz java/io/PrintStream; const #42 = Asciz println; const #43 = Asciz (Ljava/lang/String;)V; const #44 = Asciz append; const #45 = Asciz (Ljava/lang/String;)Ljava/lang/StringBuilder;; const #46 = Asciz toString; const #47 = Asciz ()Ljava/lang/String;; { public jvm.init.Example5(); Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return LineNumberTable: line 3: 0 LocalVariableTable: Start Length Slot Name Signature 0 5 0 this Ljvm/init/Example5; public static void main(java.lang.String[]); Code: Stack=4, Locals=3, Args_size=1 0: iconst_2 1: istore_1 2: iconst_3 3: istore_2 4: aload_0 5: arraylength 6: iconst_2 7: if_icmpge 19 10: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 13: ldc #3; //String Must enter any two args. 15: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/Str ing;)V 18: return 19: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 22: new #5; //class java/lang/StringBuilder 25: dup 26: invokespecial #6; //Method java/lang/StringBuilder."<init>":()V 29: aload_0 30: iconst_0 31: aaload 32: invokevirtual #7; //Method java/lang/StringBuilder.append:(Ljava/lang/ String;)Ljava/lang/StringBuilder; 35: aload_0 36: iconst_1 37: aaload 38: invokevirtual #7; //Method java/lang/StringBuilder.append:(Ljava/lang/ String;)Ljava/lang/StringBuilder; 41: invokevirtual #8; //Method java/lang/StringBuilder.toString:()Ljava/la ng/String; 44: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/Str ing;)V 47: return LineNumberTable: line 5: 0 line 6: 2 line 7: 4 line 8: 10 line 9: 18 line 12: 19 line 13: 47 LocalVariableTable: Start Length Slot Name Signature 0 48 0 args [Ljava/lang/String; 2 46 1 a I 4 44 2 b I }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值