Java类编译后Class文件概述(上)

一、Class文件

注意:每一个Class 文件都对应着唯一一个类或接口的定义信息,但是相对地,类或接口并不一定都得定义在文件里(譬如类或接口也可以通过类加载器直接生成)。

二、class文件的文件结构

class文件格式采用一种类似于C语言结构体的伪结构来存储数据,这种伪结构只有两种数据类型:无符号数和表。

class文件的结构描述

ClassFile {u4 magic; <span style="white-space:pre"></span>//4位无符号的数,表示魔数u2 minor_version;<span style="white-space:pre"></span>//次版本号u2 major_version;<span style="white-space:pre"></span>//主版本号u2 constant_pool_count;<span style="white-space:pre"></span>//常量池计数器cp_info constant_pool[constant_pool_count-1];<span style="white-space:pre"></span>//常连池u2 access_flags;<span style="white-space:pre"></span>//访问标志u2 this_class;<span style="white-space:pre"></span>//类索引u2 super_class;<span style="white-space:pre"></span>//父类索引u2 interfaces_count;<span style="white-space:pre"></span>//接口计数器u2 interfaces[interfaces_count];<span style="white-space:pre"></span>//接口表u2 fields_count;<span style="white-space:pre"></span>//字段计数器field_info fields[fields_count];<span style="white-space:pre"></span>//字段表u2 methods_count;<span style="white-space:pre"></span>//方法计数器method_info methods[methods_count];<span style="white-space:pre"></span>//方法表u2 attributes_count;<span style="white-space:pre"></span>//属性计数器attribute_info attributes[attributes_count];<span style="white-space:pre"></span>//属性表}准备的java文件public class Test {private int age;public int getAge() {return age;}public static void main(String[] args) {System.out.println("Hello World");}}对应的Test.class文件

对应的文本文件

cafe babe 0000 0034 0023 0a00 0700 14090006 0015 0900 1600 1708 0018 0a00 19001a07 001b 0700 1c01 0003 6167 6501 00014901 0006 3c69 6e69 743e 0100 0328 29560100 0443 6f64 6501 000f 4c69 6e65 4e756d62 6572 5461 626c 6501 0006 6765 74416765 0100 0328 2949 0100 046d 6169 6e010016 285b 4c6a 6176 612f 6c61 6e67 2f537472 696e 673b 2956 0100 0a53 6f75 72636546 696c 6501 0009 5465 7374 2e6a 6176610c 000a 000b 0c00 0800 0907 001d 0c001e00 1f01 000b 4865 6c6c 6f20 576f 726c6407 0020 0c00 2100 2201 0004 5465 73740100 106a 6176 612f 6c61 6e67 2f4f 626a6563 7401 0010 6a61 7661 2f6c 616e 672f5379 7374 656d 0100 036f 7574 0100 154c6a61 7661 2f69 6f2f 5072 696e 7453 74726561 6d3b 0100 136a 6176 612f 696f 2f507269 6e74 5374 7265 616d 0100 0770 72696e74 6c6e 0100 1528 4c6a 6176 612f 6c616e67 2f53 7472 696e 673b 2956 0021 00060007 0000 0001 0002 0008 0009 0000 00030001 000a 000b 0001 000c 0000 001d 00010001 0000 0005 2ab7 0001 b100 0000 01000d00 0000 0600 0100 0000 0100 0100 0e000f00 0100 0c00 0000 1d00 0100 0100 0000052a b400 02ac 0000 0001 000d 0000 00060001 0000 0005 0009 0010 0011 0001 000c0000 0025 0002 0001 0000 0009 b200 031204b6 0005 b100 0000 0100 0d00 0000 0a000200 0000 0800 0800 0900 0100 1200 00000200 13使用javap -verbose Test.class查看的结果

对应的文本

C:\Users\weixu_000\Desktop>javap -verbose Test.classClassfile /C:/Users/weixu_000/Desktop/Test.class Last modified 2015-7-4; size 499 bytes MD5 checksum 580d9204b4544445687dea33327cdb0c Compiled from "Test.java"public class Test minor version: 0 major version: 52 flags: ACC_PUBLIC, ACC_SUPERConstant pool: #1 = Methodref#7.#20// java/lang/Object."<init>":()V #2 = Fieldref#6.#21// Test.age:I #3 = Fieldref#22.#23// java/lang/System.out:Ljava/io/PrintStream; #4 = String#24// Hello World #5 = Methodref#25.#26// java/io/PrintStream.println:(Ljava/lang/String;)V #6 = Class#27// Test #7 = Class#28// java/lang/Object #8 = Utf8age #9 = Utf8I #10 = Utf8<init> #11 = Utf8()V #12 = Utf8Code #13 = Utf8LineNumberTable #14 = Utf8getAge #15 = Utf8()I #16 = Utf8main #17 = Utf8([Ljava/lang/String;)V #18 = Utf8SourceFile #19 = Utf8Test.java #20 = NameAndType#10:#11// "<init>":()V #21 = NameAndType#8:#9// age:I #22 = Class#29// java/lang/System #23 = NameAndType#30:#31// out:Ljava/io/PrintStream; #24 = Utf8Hello World #25 = Class#32// java/io/PrintStream #26 = NameAndType#33:#34// println:(Ljava/lang/String;)V #27 = Utf8Test #28 = Utf8java/lang/Object #29 = Utf8java/lang/System #30 = Utf8out #31 = Utf8Ljava/io/PrintStream; #32 = Utf8java/io/PrintStream #33 = Utf8println #34 = Utf8(Ljava/lang/String;)V{ public Test();descriptor: ()Vflags: ACC_PUBLICCode:stack=1, locals=1, args_size=10: aload_01: invokespecial #1// Method java/lang/Object."<init>":()V4: returnLineNumberTable:line 1: 0 public int getAge();descriptor: ()Iflags: ACC_PUBLICCode:stack=1, locals=1, args_size=10: aload_01: getfield#2// Field age:I4: ireturnLineNumberTable:line 5: 0 public static void main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Vflags: ACC_PUBLIC, ACC_STATICCode:stack=2, locals=1, args_size=10: getstatic#3// Field java/lang/System.out:Ljava/io/PrintStream;3: ldc#4// String Hello World5: invokevirtual #5// Method java/io/PrintStream.println:(Ljava/lang/String;)V8: returnLineNumberTable:line 8: 0line 9: 8}SourceFile: "Test.java"准备工作完成。三、class文件概述1、魔数及主次版本信息只要看得开放得下,何愁没有快乐的春莺在啼鸣,

Java类编译后Class文件概述(上)

相关文章:

你感兴趣的文章:

标签云: