Java类文件结构(Class文件)

来源:互联网 发布:迪卡侬14.9背包知乎 编辑:程序博客网 时间:2024/06/15 15:36

今天学了一点关于类文件结构(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.TestClassCompiled 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.TestClassClassfile /D:/EclipseProject/JavaProjects/JVMtest/bin/www/wq/ch02/TestClass.class  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_SUPERConstant 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类文件的结构:




0 0
原创粉丝点击