今天学了一点关于类文件结构(class文件)的知识。
JVM的出现,使得大量的生成类文件结构的语言出现和发展(如Go,Scala等)。将我们编写的程序编译成二进制的本地机器码(C/C++使用的)变得不在是唯一的选择。
JVM是不关心class文件是来源是何种语言。它只与class文件这一特定的二进制文件有关。class文件是一组以8位字节(64bit)为基础单位的二进制数据流。流中的数据是严格按照顺序来的,中间是没有任何的分隔符的。class文件的格式是有点像C语言中的结构体来存储数据的。这种结构只有两种数据类型:无符号数和表。
这个例子是展示了class文件的具体内容
代码:
package www.wq.ch02;
public class TestClass {
private int m;
public int inc(){
return m+1;
}
}
接着我们尝试着在命令行窗口中使用javap指令来查看class文件;
C:\Users\Administrator>d:
D:\EclipseProject\JavaProjects\JVMtest\bin\www\wq\ch02>javap TestClass
警告: 二进制文件TestClass包含www.wq.ch02.TestClass
Compiled from "TestClass.java"
public class www.wq.ch02.TestClass {
public www.wq.ch02.TestClass();
public int inc();
}
D:\EclipseProject\JavaProjects\JVMtest\bin\www\wq\ch02>javap -verbose TestClass
警告: 二进制文件TestClass包含www.wq.ch02.TestClass
Classfile /D:/EclipseProject/JavaProjects/JVMtest/bin/www/wq/ch02/TestClass.clas
s
Last modified 2016-1-14; size 377 bytes //这里显示了文件的大小
MD5 checksum 82a4906fb62922198bab5d1c1ae4cfc0
Compiled from "TestClass.java"
public class www.wq.ch02.TestClass
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool: //这里显示的是常量池
#1 = Class #2 // www/wq/ch02/TestClass
#2 = Utf8 www/wq/ch02/TestClass
#3 = Class #4 // java/lang/Object
#4 = Utf8 java/lang/Object
#5 = Utf8 m
#6 = Utf8 I(这是大写的i)
#7 = Utf8 <init>
#8 = Utf8 ()V
#9 = Utf8 Code
#10 = Methodref #3.#11 // java/lang/Object."<init>":()V
#11 = NameAndType #7:#8 // "<init>":()V
#12 = Utf8 LineNumberTable
#13 = Utf8 LocalVariableTable
#14 = Utf8 this
#15 = Utf8 Lwww/wq/ch02/TestClass;
#16 = Utf8 inc
#17 = Utf8 ()I
#18 = Fieldref #1.#19 // www/wq/ch02/TestClass.m:I
#19 = NameAndType #5:#6 // m:I
#20 = Utf8 SourceFile
#21 = Utf8 TestClass.java
{
public www.wq.ch02.TestClass();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #10 // Method java/lang/Object."<init>
":()V
4: return
LineNumberTable:
line 3: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lwww/wq/ch02/TestClass;
public int inc();
descriptor: ()I
flags: ACC_PUBLIC
Code:
stack=2, locals=1, args_size=1
0: aload_0
1: getfield #18 // Field m:I
4: iconst_1
5: iadd
6: ireturn
LineNumberTable:
line 6: 0
LocalVariableTable:
Start Length Slot Name Signature
0 7 0 this Lwww/wq/ch02/TestClass;
}
SourceFile: "TestClass.java"
D:\EclipseProject\JavaProjects\JVMtest\bin\www\wq\ch02>
下面这个结构图向我们详细的展示了Class类文件的结构: