今天學了一點關於類文件結構(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類文件的結構: