JDK之编译过程与编译原理

1.概述

我们今天要讲的就是Example.java到Example.class的过程与原理
在这里插入图片描述
javac:是jdk的一个工具,将java文件编译为class文件

2.编译过程

在这里插入图片描述

3.测试样例[编译结果class文件解析说明]

3.1.我们创建了一个项目demo-gvm,其中创建了一个类App.java文件

在这里插入图片描述
现在我们用最原始的javac命令去编译这个文件

localhost:demo gaoxinfu$ pwd
/Users/gaoxinfu/demo-gvm/src/main/java/com/gaoxinfu/demo
localhost:demo gaoxinfu$ ls -la
total 8
drwxr-xr-x  3 gaoxinfu  staff   96 Feb 13 14:59 .
drwxr-xr-x  4 gaoxinfu  staff  128 Feb 13 14:57 ..
-rw-r--r--  1 gaoxinfu  staff  180 Feb 13 14:56 App.java
localhost:demo gaoxinfu$ javac App.java 
localhost:demo gaoxinfu$ 

3.2.查看原始的.class代码

cafe babe 0000 0034 001d 0a00 0600 0f09
0010 0011 0800 120a 0013 0014 0700 1507
0016 0100 063c 696e 6974 3e01 0003 2829
5601 0004 436f 6465 0100 0f4c 696e 654e
756d 6265 7254 6162 6c65 0100 046d 6169
6e01 0016 285b 4c6a 6176 612f 6c61 6e67
2f53 7472 696e 673b 2956 0100 0a53 6f75
7263 6546 696c 6501 0008 4170 702e 6a61
7661 0c00 0700 0807 0017 0c00 1800 1901
000c 4865 6c6c 6f20 576f 726c 6421 0700
1a0c 001b 001c 0100 1563 6f6d 2f67 616f
7869 6e66 752f 6465 6d6f 2f41 7070 0100
106a 6176 612f 6c61 6e67 2f4f 626a 6563
7401 0010 6a61 7661 2f6c 616e 672f 5379
7374 656d 0100 036f 7574 0100 154c 6a61
7661 2f69 6f2f 5072 696e 7453 7472 6561
6d3b 0100 136a 6176 612f 696f 2f50 7269
6e74 5374 7265 616d 0100 0770 7269 6e74
6c6e 0100 1528 4c6a 6176 612f 6c61 6e67
2f53 7472 696e 673b 2956 0021 0005 0006
0000 0000 0002 0001 0007 0008 0001 0009
0000 001d 0001 0001 0000 0005 2ab7 0001
b100 0000 0100 0a00 0000 0600 0100 0000
0700 0900 0b00 0c00 0100 0900 0000 2500
0200 0100 0000 09b2 0002 1203 b600 04b1
0000 0001 000a 0000 000a 0002 0000 000b
0008 000c 0001 000d 0000 0002 000e 

在这里插入图片描述

3.3.原始文件class结构的内容解析

[https://docs.oracle.com/javase/8/index.html]
在这里插入图片描述https://docs.oracle.com/javase/specs/index.html
在这里插入图片描述
https://docs.oracle.com/javase/specs/jvms/se8/html/index.html
在这里插入图片描述https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html
在这里插入图片描述
这个class文件结构的介绍

ClassFile {
    u4             magic;  #文件类型
    u2             minor_version; # jdk版本
    u2             major_version; # jdk版本
    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];
}

前面是数据类型,关于介绍大家参考下面的地址
https://www.cnblogs.com/gulang-jx/p/9846456.html

3.4.我们对照上面的class结构与App.class文件 我们进行分析

cafe babe 0000 0034 001d 0a00 0600 0f09
0010 0011 0800 120a 0013 0014 0700 1507
0016 0100 063c 696e 6974 3e01 0003 2829
5601 0004 436f 6465 0100 0f4c 696e 654e
756d 6265 7254 6162 6c65 0100 046d 6169
6e01 0016 285b 4c6a 6176 612f 6c61 6e67
2f53 7472 696e 673b 2956 0100 0a53 6f75
7263 6546 696c 6501 0008 4170 702e 6a61
7661 0c00 0700 0807 0017 0c00 1800 1901
000c 4865 6c6c 6f20 576f 726c 6421 0700
1a0c 001b 001c 0100 1563 6f6d 2f67 616f
7869 6e66 752f 6465 6d6f 2f41 7070 0100
106a 6176 612f 6c61 6e67 2f4f 626a 6563
7401 0010 6a61 7661 2f6c 616e 672f 5379
7374 656d 0100 036f 7574 0100 154c 6a61
7661 2f69 6f2f 5072 696e 7453 7472 6561
6d3b 0100 136a 6176 612f 696f 2f50 7269
6e74 5374 7265 616d 0100 0770 7269 6e74
6c6e 0100 1528 4c6a 6176 612f 6c61 6e67
2f53 7472 696e 673b 2956 0021 0005 0006
0000 0000 0002 0001 0007 0008 0001 0009
0000 001d 0001 0001 0000 0005 2ab7 0001
b100 0000 0100 0a00 0000 0600 0100 0000
0700 0900 0b00 0c00 0100 0900 0000 2500
0200 0100 0000 09b2 0002 1203 b600 04b1
0000 0001 000a 0000 000a 0002 0000 000b
0008 000c 0001 000d 0000 0002 000e 
1.u4 标示4个字节,16进制,就是前面 cafe babe,也就是cafe babe开头的都是class文件

3.4.1.magic [前面4个字节]

1.magic这个是标示了一下文件类型,

3.4.2.minor_version[2个字节]

0000 0034 对应10进制的52,代表JDK 8中的一个版本

其他不在赘述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东山富哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值