Java类编译后Class文件概述(下)

具体的实例Java文件

package com.weixuan.test;public class MyTest {private int age;private String name;public int getAge() {return age;}public String getName() {return name;}public void setAge(int age) {this.age = age;}public void setName(String name) {this.name = name;}public static void main(String[] args) {}}

使用javac -g:vars MyTest.java编译,显示localvariable

C:\Users\weixu_000\Desktop>javac -g:vars MyTest.javaC:\Users\weixu_000\Desktop>javap -verbose MyTest.classClassfile /C:/Users/weixu_000/Desktop/MyTest.class Last modified 2015-7-5; size 708 bytes MD5 checksum 2d2527c48aba8637fbf99840391879aapublic class com.weixuan.test.MyTest minor version: 0 major version: 52 flags: ACC_PUBLIC, ACC_SUPERConstant pool: #1 = Methodref#5.#28// java/lang/Object."<init>":()V #2 = Fieldref#4.#29// com/weixuan/test/MyTest.age:I #3 = Fieldref#4.#30// com/weixuan/test/MyTest.name:Ljava/lang/String; #4 = Class#31// com/weixuan/test/MyTest #5 = Class#32// java/lang/Object #6 = Utf8age #7 = Utf8I #8 = Utf8name #9 = Utf8Ljava/lang/String; #10 = Utf8<init> #11 = Utf8()V #12 = Utf8Code #13 = Utf8LocalVariableTable #14 = Utf8this #15 = Utf8Lcom/weixuan/test/MyTest; #16 = Utf8getAge #17 = Utf8()I #18 = Utf8getName #19 = Utf8()Ljava/lang/String; #20 = Utf8setAge #21 = Utf8(I)V #22 = Utf8setName #23 = Utf8(Ljava/lang/String;)V #24 = Utf8main #25 = Utf8([Ljava/lang/String;)V #26 = Utf8args #27 = Utf8[Ljava/lang/String; #28 = NameAndType#10:#11// "<init>":()V #29 = NameAndType#6:#7// age:I #30 = NameAndType#8:#9// name:Ljava/lang/String; #31 = Utf8com/weixuan/test/MyTest #32 = Utf8java/lang/Object{ public com.weixuan.test.MyTest();descriptor: ()Vflags: ACC_PUBLICCode:stack=1, locals=1, args_size=10: aload_01: invokespecial #1// Method java/lang/Object."<init>":()V4: returnLocalVariableTable:Start Length Slot Name Signature050 this Lcom/weixuan/test/MyTest; public int getAge();descriptor: ()Iflags: ACC_PUBLICCode:stack=1, locals=1, args_size=10: aload_01: getfield#2// Field age:I4: ireturnLocalVariableTable:Start Length Slot Name Signature050 this Lcom/weixuan/test/MyTest; public java.lang.String getName();descriptor: ()Ljava/lang/String;flags: ACC_PUBLICCode:stack=1, locals=1, args_size=10: aload_01: getfield#3// Field name:Ljava/lang/String;4: areturnLocalVariableTable:Start Length Slot Name Signature050 this Lcom/weixuan/test/MyTest; public void setAge(int);descriptor: (I)Vflags: ACC_PUBLICCode:stack=2, locals=2, args_size=20: aload_01: iload_12: putfield#2// Field age:I5: returnLocalVariableTable:Start Length Slot Name Signature060 this Lcom/weixuan/test/MyTest;061 age I public void setName(java.lang.String);descriptor: (Ljava/lang/String;)Vflags: ACC_PUBLICCode:stack=2, locals=2, args_size=20: aload_01: aload_12: putfield#3// Field name:Ljava/lang/String;5: returnLocalVariableTable:Start Length Slot Name Signature060 this Lcom/weixuan/test/MyTest;061 name Ljava/lang/String; public static void main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Vflags: ACC_PUBLIC, ACC_STATICCode:stack=0, locals=1, args_size=10: returnLocalVariableTable:Start Length Slot Name Signature010 args [Ljava/lang/String;}

对应的字节码

cafe babe 0000 0034 001f 0a00 0500 1a090004 001b 0900 0400 1c07 001d 0700 1e010003 6167 6501 0001 4901 0004 6e61 6d650100 124c 6a61 7661 2f6c 616e 672f 53747269 6e67 3b01 0006 3c69 6e69 743e 01000328 2956 0100 0443 6f64 6501 000f 4c696e65 4e75 6d62 6572 5461 626c 6501 00066765 7441 6765 0100 0328 2949 0100 07676574 4e61 6d65 0100 1428 294c 6a61 76612f6c 616e 672f 5374 7269 6e67 3b01 00067365 7441 6765 0100 0428 4929 5601 00077365 744e 616d 6501 0015 284c 6a61 76612f6c 616e 672f 5374 7269 6e67 3b29 56010004 6d61 696e 0100 1628 5b4c 6a61 76612f6c 616e 672f 5374 7269 6e67 3b29 5601000a 536f 7572 6365 4669 6c65 0100 0b4d7954 6573 742e 6a61 7661 0c00 0a00 0b0c0006 0007 0c00 0800 0901 0017 636f 6d2f7765 6978 7561 6e2f 7465 7374 2f4d 79546573 7401 0010 6a61 7661 2f6c 616e 672f4f62 6a65 6374 0021 0004 0005 0000 00020002 0006 0007 0000 0002 0008 0009 00000006 0001 000a 000b 0001 000c 0000 001d0001 0001 0000 0005 2ab7 0001 b100 00000100 0d00 0000 0600 0100 0000 0300 01000e00 0f00 0100 0c00 0000 1d00 0100 01000000 052a b400 02ac 0000 0001 000d 00000006 0001 0000 0009 0001 0010 0011 0001000c 0000 001d 0001 0001 0000 0005 2ab40003 b000 0000 0100 0d00 0000 0600 01000000 0d00 0100 1200 1300 0100 0c00 00002200 0200 0200 0000 062a 1bb5 0002 b1000000 0100 0d00 0000 0a00 0200 0000 11000500 1200 0100 1400 1500 0100 0c00 00002200 0200 0200 0000 062a 2bb5 0003 b1000000 0100 0d00 0000 0a00 0200 0000 15000500 1600 0900 1600 1700 0100 0c00 00001900 0000 0100 0000 01b1 0000 0001 000d0000 0006 0001 0000 001a 0001 0018 00000002 0019

具体的解释

1、magic number : 前四个字节 cafe babe,咖啡宝贝

2、次主版本:接下来的四个字节 0000 0034

3、常量池

前两个字节是常量池容量计数器,后面才是常量池

001f : 常量池容量计数器 十进制的31 也就是说,有30个常量,索引是1到30

4、访问标志

常量池结束之后,就是访问标志。

0021 : 只有ACC_PUBLIC和ACC_SUPER为真。即这个类是public 的普通类,无其他修饰符

5、类索引,父类索引与接口索引集合

访问标志之后,就是类索引,父类索引和接口索引集合。

生命不是一场赛跑,而是一次旅行。比赛在乎终点,而旅行在乎沿途风景。

Java类编译后Class文件概述(下)

相关文章:

你感兴趣的文章:

标签云: