欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JDK之编译过程与编译原理

程序员文章站 2022-07-12 20:08:43
...

1.概述

我们今天要讲的就是Example.java到Example.class的过程与原理
JDK之编译过程与编译原理
javac:是jdk的一个工具,将java文件编译为class文件

2.编译过程

JDK之编译过程与编译原理

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

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

JDK之编译过程与编译原理
现在我们用最原始的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 

JDK之编译过程与编译原理

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

[https://docs.oracle.com/javase/8/index.html]
JDK之编译过程与编译原理https://docs.oracle.com/javase/specs/index.html
JDK之编译过程与编译原理
https://docs.oracle.com/javase/specs/jvms/se8/html/index.html
JDK之编译过程与编译原理https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html
JDK之编译过程与编译原理
这个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中的一个版本

其他不在赘述