《Java核心技术》 Class类文件结构

来源:互联网 发布:定格动画软件 编辑:程序博客网 时间:2024/06/08 15:41

运行机制

开篇

源代码HelloWorld.java

/** * Created by jack on 2017/3/16. * * @author jack * @date 2017/03/16 */public class HelloWorld {    public static void main(String[] args){        System.out.println("Hello,World");    }}

编译成HelloWorld.class

cafe babe 0000 0031 0022 0a00 0600 14090015 0016 0800 170a 0018 0019 0700 1a07001b 0100 063c 696e 6974 3e01 0003 28295601 0004 436f 6465 0100 0f4c 696e 654e756d 6265 7254 6162 6c65 0100 124c 6f63616c 5661 7269 6162 6c65 5461 626c 65010004 7468 6973 0100 0c4c 4865 6c6c 6f576f72 6c64 3b01 0004 6d61 696e 0100 16285b4c 6a61 7661 2f6c 616e 672f 5374 72696e67 3b29 5601 0004 6172 6773 0100 135b4c6a 6176 612f 6c61 6e67 2f53 7472 696e673b 0100 0a53 6f75 7263 6546 696c 6501000f 4865 6c6c 6f57 6f72 6c64 2e6a 6176610c 0007 0008 0700 1c0c 001d 001e 01000b48 656c 6c6f 2c57 6f72 6c64 0700 1f0c0020 0021 0100 0a48 656c 6c6f 576f 726c6401 0010 6a61 7661 2f6c 616e 672f 4f626a65 6374 0100 106a 6176 612f 6c61 6e672f53 7973 7465 6d01 0003 6f75 7401 00154c6a 6176 612f 696f 2f50 7269 6e74 53747265 616d 3b01 0013 6a61 7661 2f69 6f2f5072 696e 7453 7472 6561 6d01 0007 7072696e 746c 6e01 0015 284c 6a61 7661 2f6c616e 672f 5374 7269 6e67 3b29 5600 21000500 0600 0000 0000 0200 0100 0700 08000100 0900 0000 2f00 0100 0100 0000 052ab700 01b1 0000 0002 000a 0000 0006 00010000 0007 000b 0000 000c 0001 0000 0005000c 000d 0000 0009 000e 000f 0001 00090000 0037 0002 0001 0000 0009 b200 021203b6 0004 b100 0000 0200 0a00 0000 0a000200 0000 0900 0800 0a00 0b00 0000 0c000100 0000 0900 1000 1100 0000 0100 12000000 0200 13

这就是jvm的byte code字节码。这一串“天书”,如果不看JVM虚拟机规范的人,正常的智商,是看不懂的。

想看懂这一串十六进制的字符,就要了解class文件协议。

第一行释义:

magic:魔数,0xCAFEBABE(cafe babe)minor_version:占2字节,次版本号,0x0000majro_version:占2字节,主版本号,0x0031,转化为十进制为49,是使用JDK1.5编译的(JDK1.5:0x0031,JDK1.6:0x0032,JDK1.7:0x0033)高版本的JDK可以向下兼容以前版本的Class文件,但是无法运行以后版本的Class文件,即使文件格式并未发生变化如果使用JDK1.5运行使用JDK1.6编译的Class文件,会报:java.lang.UnsupportedClassVersionError: Bad version number in .class file  就是由于JDK1.6编译的文件版本号超过了JDK1.5虚拟机所接受的范围

Java class文件是二进制文件。为了便于理解它,JVM提供者提供了javap,反汇编器(编译,反编译的本质,是“映射”)。

一切皆是映射(光剑)

使用javap产生的结果是Java汇编语言。在上面的例子中,下面的Java汇编代码是通过:

javap -c HelloWorld.class

进行反汇编得到的。

$ javap -c HelloWorld.class Compiled from "HelloWorld.java"public class HelloWorld {  public HelloWorld();    Code:       0: aload_0       1: invokespecial #1                  // Method java/lang/Object."<init>":()V       4: return  public static void main(java.lang.String[]);    Code:       0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;       3: ldc           #3                  // String Hello,World       5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V       8: return}

所以说,如果你足够牛逼,不需要使用java语言写源码,直接使用jvm指令集写jvm的汇编语言。这样,什么Scala,Java,Kotlin,Clojure这些运行在jvm上的高级编程语言,对你来说,真的就是浮云了。你也不需要纠结什么OOP,FP,Design Pattern, etc.

Class类文件结构


class文件的结构

简单讲,jvm的class文件是针对jvm的私家定制。只要运行在jvm上byte code,都需要按照class文件format来。否则jvm解析不了。自然无法执行。

官网文档: The Java Virtual Machine class file format

class文件时java虚拟机执行引擎的数据入口,也是java技术体系的基础支柱之一,了解class文件的结构对后面进一步了解虚拟机执行引擎有很重要的意义。

class文件是一组以八位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在class文件中,中间没有添加任何分隔符,这使得整个class文件中存储的内容几乎全部都是程序运行的必要数据,没有空隙存在。当需要占用8位字节以上的空间数据时,则会按照高位在前的方式分割成若干个8位字节进行存储。

ClassFile数据结构

ClassFile {      u4 magic;//魔数(0xCAFEBABE)      u2 minor_version;//次版本号      u2 major_version;//主版本号      u2 constant_pool_count;//常量池容量计数值      cp_info constant_pool[constant_pool_count-1];//常量池      u2 access_flags;//访问标志      u2 this_class;//类索引      u2 super_class;//父类索引      u2 interfaces_count;//接口计数器      u2 interfaces[interfaces_count];//接口索引集合      u2 fields_count;//字段计数器      field_info fields[fields_count];//字段表      u2 methods_count;//方法计数器      method_info methods[methods_count];//方法表      u2 attributes_count;//属性表计数器      attribute_info attributes[attributes_count];//属性表集合  }

Class文件中,类的全限定名、字段、方法都是使用CONSTANT_Utf8_info类型常量来描述名称,而该常量的长度由2个字节表示,所以类的全限定名、字段名、方法名的最大长度不能超过2个字节所能表示的最大整数,也就是65535.

博文参考:

http://blog.csdn.net/a19881029/article/details/16117251

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 开发游戏平台给了钱不给东西怎么办 代号英雄与服务器断开连接了怎么办 千牛聊天页面买家信息不显示怎么办 秒拍存草稿箱的视频没了怎么办? 登录山东掌厅出现服务器错误怎么办 微信号被多人投诉被限制登录怎么办 联想平板电脑开机密码忘记了怎么办 申请的qq没登录忘了账号怎么办 炫舞时代由于网络原因登不上怎么办 qq申请太多进不了热聊怎么办 手机号申请的微信号被盗了怎么办 买菜别人少找了钱不还怎么办 在掌上英雄联盟买皮肤买错区怎么办 win8我的电脑图标没了怎么办 英雄联盟老是卡在安全扫描怎么办 英雄联盟活动送皮肤没送怎么办 电脑换完系统有些页面打不开怎么办 王卡助手交手机费页面打不开怎么办 在浏览器上打不开路由器页面怎么办 英雄联盟读条的时候自动关机怎么办 手机的位置信息开不了怎么办呢 滴滴车主接到乘客返回路程要怎么办 移动换话费积分是发什么短信怎么办 手机店积分换手机被贷款怎么办 心悦俱乐部礼包已过期是怎么办 心悦兑换的东西不是账号绑定怎么办 心悦会员绑定的手机号不用了怎么办 想在京东商城开个网店怎么办呢 京东买了东西收货了不想要了怎么办 京东转卖的商品有问题怎么办 如果衣服下架了然后有退货怎么办 想买二手车可没有懂车的人怎么办 买车的时候异地车牌回家怎么办 天猫下单显示下单人数太多券怎么办 英雄联盟进入游戏后无限崩溃怎么办 打开电视显示百度影棒打不开怎么办 家里路由器网速一会快一会慢怎么办 用快看影视下载电影网速太慢怎么办 苹果手机下载东西网速特别慢怎么办 网上买重庆时时彩输了很多钱怎么办 找不到自己在哪个平台借过钱怎么办