(5) 深入理解Java Class文件格式(四)
转载:http://blog.csdn.net/zhangjg_blog/article/details/21658415
前情回顾
- CONSTANT_Utf8_info
- CONSTANT_NameAndType_info 。
常量池中各数据项类型详解(续)
(3)CONSTANT_Integer_info
- package com.jg.zhang;
- public class TestInt {
- void printInt(){
- System.out.println(65535);
- }
- }
将上面的类生成的class文件反编译:
- D:\Workspace\AndroidWorkspace\BlogTest\bin>javap -v -c -classpath . com.jg.zhang.TestInt
下面列出反编译的结果, 由于反编译结果较长, 我们省略了大部分信息:
- ..................
- ..................
- Constant pool:
- ..................
- ..................
- #21 = Integer 65535
- ..................
- ..................
- {
- ..................
- ..................
- void printInt();
- flags:
- Code:
- stack=2, locals=1, args_size=1
- 0: getstatic #15 // Field java/lang/System.out:Ljava/io/PrintStream;
- 3: ldc #21 // int 65535
- 5: invokevirtual #22 // Method java/io/PrintStream.println:(I)V
- 8: return
- LineNumberTable:
- line 6: 0
- line 7: 8
- LocalVariableTable:
- Start Length Slot Name Signature
- 0 9 0 this Lcom/jg/zhang/TestInt;
- }
上面的输出结果中, 保留了printInt方法的反编译结果, 并且保留了常量池中的第21项。 首先看printInt方法反编译结果中的索引为3 的字节码指令:
- 3: ldc #21 // int 65535
这条ldc指令, 引用了常量池中的第21项, 而第21项是一个CONSTANT_Integer_info, 并且这个CONSTANT_Integer_info存储的整型值为65535 。
(4)CONSTANT_Float_info
- void printFloat(){
- System.out.println(1234.5f);
- }
那么在这个类的常量池中就会有一个CONSTANT_Float_info与之相对应, 这个CONSTANT_Float_info的形式如下:
- Constant pool:
- .............
- .............
- #29 = Float 1234.5f
- ............
- ............
- {
- ............
- ............
- void printFloat();
- flags:
- Code:
- stack=2, locals=1, args_size=1
- 0: getstatic #15 // Field java/lang/System.out:Ljava/io/PrintStream;
- 3: ldc #29 // float 1234.5f
- 5: invokevirtual #30 // Method java/io/PrintStream.println:(F)V
- 8: return
- LineNumberTable:
- line 10: 0
- line 11: 8
- LocalVariableTable:
- Start Length Slot Name Signature
- 0 9 0 this Lcom/jg/zhang/TestInt;
- }
(5)CONSTANT_Long_info
- void printLong(){
- System.out.println(123456L);
- }
- Constant pool:
- ..............
- ..............
- #21 = Long 123456l
- ..............
- ..............
- {
- ..............
- ..............
- void printLong();
- flags:
- Code:
- stack=3, locals=1, args_size=1
- 0: getstatic #15 // Field java/lang/System.out:Ljava/io/PrintStream;
- 3: ldc2_w #21 // long 123456l
- 6: invokevirtual #23 // Method java/io/PrintStream.println:(J)V
- 9: return
- LineNumberTable:
- line 7: 0
- line 8: 9
- LocalVariableTable:
- Start Length Slot Name Signature
- 0 10 0 this Lcom/jg/zhang/TestInt;
- }
(6)CONSTANT_Double_info
- void printDouble(){
- System.out.println(123456D);
- }
- Constant pool:
- ..............
- ..............
- #21 = Double 123456.0d
- ..............
- ..............
- {
- ..............
- ..............
- void printDouble();
- flags:
- Code:
- stack=3, locals=1, args_size=1
- 0: getstatic #15 // Field java/lang/System.out:Ljava/io/PrintStream;
- 3: ldc2_w #21 // double 123456.0d
- 6: invokevirtual #23 // Method java/io/PrintStream.println:(D)V
- 9: return
- LineNumberTable:
- line 7: 0
- line 8: 9
- LocalVariableTable:
- Start Length Slot Name Signature
- 0 10 0 this Lcom/jg/zhang/TestInt;
- }
(7) CONSTANT_String_info
- void printStrng(){
- System.out.println("abcdef");
- }
- Constant pool:
- ..............
- ..............
- #21 = String #22 // abcdef
- #22 = Utf8 abcdef
- ..............
- ..............
- {
- ..............
- ..............
- void printStrng();
- flags:
- Code:
- stack=2, locals=1, args_size=1
- 0: getstatic #15 // Field java/lang/System.out:Ljava/io/PrintStream;
- 3: ldc #21 // String abcdef
- 5: invokevirtual #23 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
- 8: return
- LineNumberTable:
- line 7: 0
- line 8: 8
- LocalVariableTable:
- Start Length Slot Name Signature
- 0 9 0 this Lcom/jg/zhang/TestInt;
- }
其中printString方法中索引为3的字节码指令ldc引用常量池中的第21项, 第21项是一个CONSTANT_String_info, 这个位于第21项的CONSTANT_String_info又引用了常量池的第22项, 第22项是一个CONSTANT_Utf8_info, 这个CONSTANT_Utf8_info中存储的字符串是 abcdef 。 引用关系的内存布局如下:
总结
- CONSTANT_Class_info
- CONSTANT_Fieldref_info
- CONSTANT_Methodref_info
- CONSTANT_InterfaceMethodref_info
(5) 深入理解Java Class文件格式(四)的更多相关文章
- (8) 深入理解Java Class文件格式(七)
转载:http://blog.csdn.net/zhangjg_blog/article/details/22091529 本专栏列前面的一系列博客, 对Class文件中的一部分数据项进行了介绍. 本 ...
- (6) 深入理解Java Class文件格式(五)
前情回顾 本专栏的前几篇博文, 对class文件中的常量池进行了详细的解释. 前文讲解了常量池中的7种数据项, 它们分别是: CONSTANT_Utf8_info CONSTANT_NameAndTy ...
- (4) 深入理解Java Class文件格式(三)
转载:http://blog.csdn.net/zhangjg_blog/article/details/21557357 首先, 让我们回顾一下关于class文件格式的之前两篇博客的主要内容. 在 ...
- (3) 深入理解Java Class文件格式(二)
好文转载:http://blog.csdn.net/zhangjg_blog/article/details/21487287 在上一篇文章 深入理解Java Class文件格式(一) 中, 介绍了c ...
- (2) 深入理解Java Class文件格式(一)
好文转载:http://blog.csdn.net/zhangjg_blog/article/details/21486985 Class文件在Java体系结构中的位置和作用 在上一篇博客中, 大致讲 ...
- 【由浅入深理解java集合】(四)——集合 Queue
今天我们来介绍下集合Queue中的几个重要的实现类.关于集合Queue中的内容就比较少了.主要是针对队列这种数据结构的使用来介绍Queue中的实现类. Queue用于模拟队列这种数据结构,队列通常是指 ...
- 重读《深入理解Java虚拟机》四、虚拟机如何加载Class文件
1.Java语言的特性 Java代码经过编译器编译成Class文件(字节码)后,就需要虚拟机将其加载到内存里面执行字节码所定义的代码实现程序开发设定的功能. Java语言中类型的加载.连接(验证.准备 ...
- 深入理解java虚拟机(四)垃圾收集算法及HotSpot实现
垃圾收集算法 一般来说,垃圾收集算法分为四类: 标记-清除算法 最基础的算法便是标记-清除算法(Mark-Sweep).算法分为“标记”和“清除”两个阶段:首先标记处需要收集的对象,在标记完成之后,再 ...
- 深入理解JAVA集合系列四:ArrayList源码解读
在开始本章内容之前,这里先简单介绍下List的相关内容. List的简单介绍 有序的collection,用户可以对列表中每个元素的插入位置进行精确的控制.用户可以根据元素的整数索引(在列表中的位置) ...
随机推荐
- mysql时间格式化,按时间段查询MYSQL语句
描述:有一个会员表,有个birthday字段,值为'YYYY-MM-DD'格式,现在要查询一个时间段内过生日的会员,比如'06-03'到'07-08'这个时间段内所有过生日的会员. SQL语句: Se ...
- 20145334 《Java程序设计》第10周学习总结
20145334 <Java程序设计>第10周学习总结 教材学习内容总结 一.网络编程 •网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入 ...
- vue 解决display与 transition冲突
下边是vue的源码 var raf = inBrowser && window.requestAnimationFrame; var waitForTransitionStart = ...
- Struts2基础学习总结
引用自:http://www.cnblogs.com/jbelial/archive/2012/05/10/2486886.html Struts 2是在WebWork2基础发展而来的. 注意:str ...
- Codevs 3287 货车运输
题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过 ...
- 图文详解MFC程序设置菜单快捷键
原来觉得添加个快捷键就只要几分钟,上网搜索文章都写得很模糊, 只有这边文章不错. http://www.cplusplus.me/1263.html http://blog.sina.com.cn/s ...
- yii1 render方法解析(记录下)
先判断主题(themes)中是否有相对应的文件,如果没有变换file为protected/views路径下的文件,如果有文件则变换为themes路径下的文件.然后,如果加载了viewrender模块( ...
- Linux系统下安装MongoDB 指南
1.首先连接到Linux系统. 2.到MongoDB官网下载合适的MongoDB安装压缩包. 下载页面:https://www.mongodb.org/downloads#production. 这里 ...
- ASP.NET Page执行顺序【转】
一.ASP.NET 母版页和内容页中的事件 母版页和内容页都可以包含控件的事件处理程序.对于控件而言,事件是在本地处理的,即内容页中的控件在内容页中引发事件,母版页中的控件在母版页中引发事件.控件事件 ...
- JAVA - ATM机程序
ATM机程序 UnionPayTest.java package oo.day06.work; public class UnionPayTest { } interface UnionPay{ // ...