java7:核心技术与最佳实践读书笔记——字节代码格式
一般流程:开发人员写出java源代码(.java) -> javac(编译器) -> java字节代码(.class) -> 加载 -> java虚拟机(jvm)运行。
1、常见java源代码的字节代码表现形式
- 包名: com.java.sample -> com/java/sample
 - 基本类型:byte、char、double、float、int、long、boolean -> B、C、D、F、I、J、S、Z
 - 引用类型:统一使用 "L" 前缀和 ";" 后缀,如:java.lang.String -> Ljava/lang/String;
 - 数组类型:采用 "[" 前缀,如:double[] -> [D,double[][] -> [[D
 - 空类型:void -> V
 - 方法:int calculate(String str) -> 方法的类型描述符:(Ljava/lang/String;)I ,还需要包含方法的签名信息
 
2、基本格式
| u4 | 魔法数 | 字节代码格式的标识符,固定为0xCAFEBABE,“咖啡宝贝”,java名称的由来 | 
| u2 | 小版本号 | |
| u2 | 大版本号 | jdk7版本号:51.0 -> 0x0000 0033(4个字节) | 
| u2 | 常量池中常量的个数再加1 | 包含基本类型和字符串常量值、类、接口和域的名称,每个常量的类型和所占用的字节数是不同的。常量池是一张表,定义了常量的序号和常量的值。 | 
| cp_info | 常量池内容的数组 | cp_info结构表示每个常量的具体定义 | 
| u2 | 访问控制标记和属性修饰符 | 每个标记或者修饰符对应一个比特位,比如:public -> 0x0001 , private -> 0x0002, final -> 0x0010, interface -> 0x0200, abstract -> 0x4000, synthetic -> 0x1000(由编译器生成,源码中无此关键字),annotation -> 0x2000等 | 
| u2 | 当前类或接口信息的常量池序号 | |
| u2 | 父类或者父接口信息的常量池序号 | 如果当前类为java.lang.Object,则两个字节值为0, 因为Object没有父类 | 
| u2 | 实现接口的个数 | |
| u2 | 域的个数 | |
| field_info | 包含域信息的数组 | |
| u2 | 方法的个数 | |
| method_info | 包含方法信息的数组 | |
| u2 | 属性的个数 | |
| attribute_info | 包含属性信息的数组 | 
- 字节代码中只包含基本类型:int、long、float、double的对应表示,其他基本类型都可用int来表示。
 - int、float标签后面跟着4个字节的数据,long和double标签后面跟着8个字节的数据。
 - CONSTANT_Utf8_info表示一个使用修改后的UTF-8格式表示的字符串序列,标签后的两个字节表示序列的长度,紧接着是序列的内容。如:this -> 0x0004<this> //this为4个字节长,序列内容为“this”
 - CONSTANT_String_info直接引用CONSTANT_Utf8_info常量,值包含一个对应的常量池中的序号。如:String:cp_info_#17 //17号常量池序号 -> 0x0005<hello>
 - CONSTANT_Class_info表示类和接口,在标签后面是类或者接口的全名对应的CONSTANT_Utf8_info常量的序号。如:Class name:cp_info_#2 //17号常量池序号 -> 0x0010<java/lang/Object>
 - 类或接口的域和方法,由两类常量来共同表示:
 - 第一类常量CONSTANT_NameAndType_info表示域和方法的名称和类型,分别由两个CONSTANT_Utf8_info常量来表示
 
| Name | cp_info_#7<str> | 
| Descriptor | cp_info_#8<Ljava/lang/String;> | 
- 第二类常量表示域和方法与类或接口的对应关系。
 - CONSTANT_Fieldref_info:域信息
 - CONSTANT_Methodref_info:类方法信息
 - CONSTANT_InterfaceMethodref_info:接口方法信息
 - 上面三类结构相似,标签之后分别是表示所在类或接口的CONSTANT_Class_info常量和表示名称与类型的CONSTANT_NameAndType_inifo常量的序号。如:
 
| Class name | cp_info_#1<test/TestClass> | 
| Name and type | cp_info_#19<str : Ljava/lang/String;> | 
| u2 | 访问控制标记和属性修饰符 | 
| u2 | 名称的常量的序号 | 
| u2 | 类型描述符的常量的序号 | 
| u2 | 属性的个数 | 
| attribute_info | 包含属性信息的数组 | 
| name | cp_info_#5<value> | 
| Descritpor: | cp_info_#6<I> | 
| Acess flags: | 0x0002[private] | 
| name | cp_info_#24<getValue> | 
| Descriptor | cp_info_#25<()I> | 
| Acess flags | 0x0001[ public ] | 
| u2 | 属性名称对应的常量序号 | 
| u4 | 属性值得字节数组的长度 | 
| 不定长 | 属性值得字节数组 | 
java7:核心技术与最佳实践读书笔记——字节代码格式的更多相关文章
- java7:核心技术与最佳实践读书笔记——对象生命周期
		
流程:字节码文件(.class) -> 类加载 -> 类链接 -> 类初始化 -> 对象初始化 -> 对象创建 -> 对象使用 -> 对象回收 . 1.Jav ...
 - java7:核心技术与最佳实践读书笔记——类加载
		
流程:class -> 加载 -> jvm虚拟机 -> 链接 . 一.类加载器概述 1.引出 类加载器也是一个java类,java.lang.ClassLoader类是所 ...
 - 《深入理解Java7核心技术与最佳实践》读书笔记(1.1)---Project Coin介绍
		
OpenJDK中的Coin项目(Project Coin)的目的就是为了收集对Java语言的语法进行增强的建议.在Coin项目开始之初,曾经广泛地向社区征求提议.在短短的一个月时间内就收到将近70条提 ...
 - php核心技术与最佳实践(笔记一)
		
1.1面向对象的型与本 类是对象的抽象组织,对象是类的具体存在. 1.1.1对象的形 <?php class Person{ public $name; public $gender; publ ...
 - PHP核心技术与最佳实践——全局浏览
		
难得买到并喜欢一本好书,‘PHP核心技术与最佳实践’. 几天时间,先看了个大概,总结一下整体是什么样子的,怎么看怎么学. 1.总共14章: 2.第1.2章讲PHP的OOP: 其中第一章侧重于PHP的O ...
 - 《深入理解OSGi:Equinox原理、应用与最佳实践》笔记_1_运行最简单的bundlehelloworld
		
<深入理解OSGi:Equinox原理.应用与最佳实践>笔记_1_运行最简单的bundlehelloworld 买了周大大的OSGI的书看 先前完全没有基础 就靠这本书看看学学 顺便记一些 ...
 - 温习《PHP 核心技术与最佳实践》这本书
		
再次看这本书,顺手提炼了一下大致目录,以便后续看见目录就知道大概讲的些什么内容 PHP 核心技术与最佳实践 1.面向对象思想的核心概念 1.1 面向对象的『形』与『本』 1.2 魔术方法的应用 1.2 ...
 - 《深入理解Java 7核心技术与最佳实践》读书笔记(2) Java语言动态性引言
		
Java语言是一种静态类型的编程语言.静态类型的含义是指在编译时进行类型检查.Java源代码中的每个变量的类型都要显式地进行声明.所有变量.方法的参数和方法返回值的类型在程序运行之前就必须是已知的.J ...
 - JavaScript设计模式与开发实践——读书笔记1.高阶函数(下)
		
上部分主要介绍高阶函数的常见形式,本部分将着重介绍高阶函数的高级应用. 1.currying currying指的是函数柯里化,又称部分求值.一个currying的函数会先接受一些参数,但不立即求值, ...
 
随机推荐
- 算法的时间复杂度——"大O分析法"(转载)
			
原文地址:https://my.oschina.net/gooke/blog/684026 一下为本人笔记:) 场景:在解决计算机科学领域的问题时,经常有好多个方法都可以,想找到最优的方法,就有了时间 ...
 - docker-compose ELK+Filebeat查看docker及容器的日志
			
我目前所在公司开发团队比较小,为集团下面的工厂开发了一套小的系统,跑在一台CentOS服务器上,服务器搭建了docker环境,安装了docker-compose,但在日志处理方面,暂时没有一个好的方法 ...
 - 使用vagrant一键部署本地php开发环境(一)
			
一:我们为什么需要用这玩意 我们在开发中经常会面临的问题:环境不一致,有人用Mac有人用Windos还有几个用linux的,而我们的服务器都是linux. 在我本地是可以的啊,我测了都,没有问题 ...
 - 静态库和动态库的区别和win平台和linux平台代码实现
			
静态库和动态库的区别 什么是库 库是写好的,现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说,库是一种可 ...
 - OLAP、OLTP的介绍CBO/RBO
			
OLTP与OLAP的介绍 数据处理大致可以分成两大类:联机事务处理OLTP(on-line transaction processing).联机分析处理OLAP(On-Line Analytical ...
 - Android:动态库(.so)调试技巧
			
一.反汇编定位crash ①查看crash log: 上图已标出crash发生在 libdeflicker_gpu.so 库中的 default_fail_func() 函数,但是 libdeflic ...
 - Editplus的运行JAVA的配置
			
工具--->参数设置
 - Flask中路由参数
			
Flask中路由参数.请求方式设置 一.参数设置 1.参数类型 Flask中参数的使用 @app.route('/parames/<username>/') def hello_world ...
 - C++ STL 已序区间查找算法
			
#include <iostream>#include <algorithm>#include <list>#include <functional># ...
 - 【计算机视觉】MTCNN的windows-cpu配置
			
前言 MTCNN是级联卷积网络,原理基本上比较清晰,只是还缺少实战,看到一个CSDN上windows的实现过程,就拿来试试. 操作过程 参考here,某些步骤会添加博主遇到的问题的解释. 第一部分:c ...