(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,用户可以对列表中每个元素的插入位置进行精确的控制.用户可以根据元素的整数索引(在列表中的位置) ...
随机推荐
- steps animation
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- php课程---简单的分页练习
在写代码时,我们可以用类来使代码更加方便简洁,下面是一个简单的查询分页练习 源代码: <html> <head> <style type="text/css&q ...
- 【iCore3 双核心板_FPGA】例程三:GPIO输入实验——识别按键输入
实验指导书及代码包下载: http://pan.baidu.com/s/1dEaDr37 iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...
- Codeigniter CRUD生成工具
Codeigniter CRUD生成工具 http://crudigniter.com/
- 关于怎样解决eclipse打开时出现的Failed to load the JNIshared library亲测有效
之前一直可以正常使用eclipse但是当我装了Oracle后打开后就出现了Failed to load the JNIshared library(下面还出现了一个jvm.dll的文件路径),当时就蒙 ...
- window.self ->window.top->window.parent
在应用有frameset或者iframe的页面时,parent是父窗口,top是最顶级父窗口(有的窗口中套了好几层frameset或者iframe),self是当前窗口, opener是用open方法 ...
- SQL Server执行计划的理解【转】
要理解执行计划,怎么也得先理解,那各种各样的名词吧.鉴于自己还不是很了解.本文打算作为只写懂的,不懂的懂了才写. 在开头要先说明,第一次看执行计划要注意,SQL Server的执行计划是从右向左看 ...
- Geolocation
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- windows下nginx+php简单配置
Nginx+php运行环境搭建 虽然目前nginx使用很广泛,在大陆主流的互联网站点或多或少会用到这个俄国人开发的小应用(占用资源小).但是我这个土鳖还是第一次自己独立配置,网上资料不少,但是还是遇到 ...
- webstorm 代码自动换行
代码自动换行 菜单File→Settings→Editor→General