注:随时更新字节码学习进度
工具:java字节码查看工具jclasslib bytecode viewer(单击可下载)
工具使用截图:
字节码分析:
来一个简单的类(什么都没有)
关联:http://blog.chinaunix.net/uid-21718047-id-3335329.html
逐个解释这10部分(图片中右侧栏中的10行)
.class十六进制机器码:也就是jvm最终的机器执行码(uedit32)打开class能看到
0、魔数
这个在字节码查看器中没有体现出来,它是由java创始人James Gosling定制,它的值是0XCAFE BABE,也就是上面十六进制的前8个字符
占用大小是4字节CA是一字节(一个字节16个二进制位java采用的是Unicode编码格式).
魔数用来区分文件类型,用文件的前几个字节来表示,0XCAFE BABE表示的是class文件(将文件类型写在文件内部即使用户重命名也没有用这样安全)
CAFE BABE翻译过来是咖啡宝贝(幸好这几个字符都在十六进制范围内)。
1、版本号(图1中1,2行)
版本号含主版本号和次版本号,各占2个字节在十六进制中0X0000 0033(在上面图中找找)前面的0000是次版本号,0033是主版本号对应十进制51也就是jdk1.7
次版本号是0,也就是jdk1.7.0
紧接版本号之后的就是常量池入口,它是是Class文件中的资源仓库
常量池中主要存储两大类常量
图解:
字面量:
字面量如文本字符串,java中声明为final的常量值等等,例如 int i = 1;把整数1赋值给int型变量i,整数1就是Java字面量
符号引用:
而符号引用如类和接口的全局限定名,字段的名称和描述符,方法的名称和描述符
为什么需要类和接口的全局限定名?系统引用类或者接口的时候不是通过内存地址进行操作吗?这里大家仔细想想,java虚拟机在没有将类加载到内存的时候根本都没有分配内存地址,也就不存在对内存的操作,所以java虚拟机首先需要将类加载到虚拟机中,那么这个过程设计对类的定位(需要加载A包下的B类,不能加载到别的包下面的别的类中),所以需要通过全局限定名来判别唯一性。这就是为什么叫做全局,限定的意思,也就是唯一性.
注:U表示1字节