(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,用户可以对列表中每个元素的插入位置进行精确的控制.用户可以根据元素的整数索引(在列表中的位置) ...
随机推荐
- html 抽奖代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 一個相當簡潔的名字—Dyson Humidifier
現在不止是白領級人物開始網購使用加濕器對皮膚的一個乾燥祈禱防護作用.目前新研究的一款家用的加濕器,戴森首款推出. 作為戴森的首款加濕器產品,該公司賦予了它一個相當簡潔的名字——Dyson Humidi ...
- JavaScript入门篇 第二天(消息对话框+网页弹出)
提问(prompt 消息对话框) prompt弹出消息对话框,通常用于询问一些需要与用户交互的信息.弹出消息对话框(包含一个确定按钮.取消按钮与一个文本输入框). 语法: prompt(str1, s ...
- php课程---简单的分页练习
在写代码时,我们可以用类来使代码更加方便简洁,下面是一个简单的查询分页练习 源代码: <html> <head> <style type="text/css&q ...
- Java 正则表达式[转载]
PS:转载自CSDN博客看上去很美 众所周知,在程序开发中,难免会遇到需要匹配.查找.替换.判断字符串的情况发生,而这些情况有时又比较复杂,如果用纯编码方式解决,往往会浪费程序员的时间及精力.因此,学 ...
- Mininet实验 源码安装Mininet
参考:MiniNet实验1 安装命令: sudo apt-get update sudo apt-get upgrade sudo apt-get install git(安装过git就可以忽略此步) ...
- jQuery 控制表单和表格
这里总结了jQuery中对表格和表单的一些常用操作, 通过这里的实例和操作肯定对jQuery的掌握有一个新得提高, 希望大家耐心看完, 多实践. <!DOCTYPE html PUBLIC &q ...
- 关于Currency类型和 TCurrencyFiled的悲剧
这2天程序出问题, 用户结算金额经常莫名其妙的多出了小数点后几位, 不用思考 肯定是因为浮点精度不准确的问题 查了一下, 程序中的数据类型使用的是Currency, 按照数据类型的描述, 这个金额类型 ...
- ASP.NET MVC中从后台控制器(Controller)传递数据到前台页面视图(View)方式
方式一: 数据存储模型Model: public class CalendarEvent { public string id { get; set; } public DateTime start ...
- 用apktool工具进行apk的编译和反编译
1.apktool下载安装 给一个2.0版的csdn地址:http://download.csdn.net/download/txj8612/7408775 下载后无需安装,直接解压缩,得到三个文件: ...