类文件结构之一:魔数、版本号和常量池
来源:互联网 发布:网络通信基础知识 编辑:程序博客网 时间:2024/05/22 13:58
1、有类如下:
package jvm.loadingclass;public class TestClass { private int m; public int inc() { return m + 1; }}
2、编译之后:
- 0、1、2、3字节为魔数CAFEBABE;
- 4,5为次版本号,6,7为主版本号,0x34=52表示jdk1.8;
- 8、9字节0x16=22,表示有21个常量,索引范围为1-21,其中索引0较为特殊,用来达到“不指向常量池的任意一个常量”;
- A字节0x07,查“常量池的项目类型表”为CONSTANT_Class_info,其结构为下表,故而B、C字节为0x0002,指向第二个常量,内容为jvm/loadingclass/TestClass;
- 0x0D字节,查表得其结构如下表,由下表知: 0x01001A6A… jvm/loadingclass/TestClass;
- 0x5E字节: 0x0A0003000B Methodref_info(u1u2u2),指向3和11,得: java/lang/Object. < init>:()V
- 0x63字节:0x0C00070008 NameAndType(u1u2u2) 指向7.8:< init>得:()V
- 0xC1字节: 0x0900010013 Fieldref_info(u1u2u2),指向1和19得: jvm/loadingclass/TestClass.m:I
3、获得所有常量:
序号 位置 常量1 0x0A 0x070002 类引用,指向第2个2 0x0D 0x01001A6A… jvm/loadingclass/TestClass3 0x2A 0x070004 类引用,指向第四个4 0x2D 0x0100106A… java/lang/Object5 0x40 0x0100016D m6 0x44 0x01000149 I7 0x48 0x010006… <init>8 0x51 0x010003… ()V9 0x57 0x010004 Code10 0x5E 0x0A0003000B Methodref_info(u1u2u2),指向3和11: java/lang/Object. <init>:()V11 0x63 0x0C00070008 NameAndType(u1u2u2) 指向7.8:<init>:()V12 0x68 0x01000F… LineNumberTable13 0x7A 0x010012… LocalVariableTable14 0x8f 0x010004… this15 0x96 0x01001C… Ljvm/loadingclass/TestClass;16 0xB5 0x010003… inc17 0xBB 0x010003… ()I18 0xC1 0x0900010013 Fieldref_info(u1u2u2),指向1和19: jvm/loadingclass/TestClass.m:I19 0xC6 0x0C00050006 NameAndType:m:I20 0xCB 0x01000A… SourceFile21 0xD8 0x01000E… TestClass.java
4、附录:
完整的编译后的文件(WinHex打开):
使用javap查看TestClass.class文件:
Classfile /F:/LAMP/MYWorkspaces/LearningJAVA/bin/jvm/loadingclass/TestClass.class Last modified 2017-10-19; size 387 bytes MD5 checksum df061cfaf6582f57693ebeb55c890962 Compiled from "TestClass.java"public class jvm.loadingclass.TestClass minor version: 0 major version: 52 flags: ACC_PUBLIC, ACC_SUPERConstant pool: #1 = Class #2 // jvm/loadingclass/TestClass #2 = Utf8 jvm/loadingclass/TestClass #3 = Class #4 // java/lang/Object #4 = Utf8 java/lang/Object #5 = Utf8 m #6 = Utf8 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 Ljvm/loadingclass/TestClass; #16 = Utf8 inc #17 = Utf8 ()I #18 = Fieldref #1.#19 // jvm/loadingclass/TestClass.m:I #19 = NameAndType #5:#6 // m:I #20 = Utf8 SourceFile #21 = Utf8 TestClass.java{ public jvm.loadingclass.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 Ljvm/loadingclass/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 Ljvm/loadingclass/TestClass;}SourceFile: "TestClass.java"
阅读全文
0 0
- 类文件结构之一:魔数、版本号和常量池
- 《深入理解Java虚拟机》——类文件结构之魔数常量池
- [jvm解析系列][五]类文件结构,魔数,最大最小版本号
- 类和结构之一
- 深入理解Java虚拟机笔记---class类文件魔数,版本,常量池
- class文件结构[3] 常量池
- class文件结构-之一
- 深入理解JVM : class文件结构之常量池(1)
- JVM之类文件结构——上篇(常量池)
- 魔数常量
- Java常量池详解之一
- Class文件内容和常量池
- C++数据类型之一:常量和变量
- C语言入门教程之一变量和常量
- 9.3 Swift结构体常量和类常量的存储属性
- 解析Java的Class文件格式——解析魔数和版本号(一)
- Java 的 Class 文件格式——解析魔数和版本号
- 解析Java的Class文件格式——解析魔数和版本号
- 回文字符,最小删除问题
- 操作符
- HihoCoder 1224:Racing(树DFS & 贪心)
- 如何进行修改SQL表结构
- jieba 分词自定义词典问题
- 类文件结构之一:魔数、版本号和常量池
- Chris Richardson 微服务系列 第四篇 微服务中的服务发现
- Java策略者模式
- 步进控制系统
- Grafana + mysql数据源
- java中Integer运算保留2位小数
- myeclipse10在创建servlet包时,包名报错
- 1002. A+B for Polynomials (25)
- 习题1