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类文件的结构:




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值