Java類文件結構(Class文件)

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




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章