一般流程:开发人员写出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、基本格式

字节代码是一个连续的字节流,其中每个部分的含义不同。字节数据分为定长和不定长,不定长会在数据最前面给出长度;定长数据则有u1、u2、u4等类型,即1字节、2字节、4字节等。多字节顺序采用大端表示。
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 包含属性信息的数组  
 
3、常量池的结构
每个常量的起始字节标明常量的类型,该字节称为标签(如:CONSTANT_String_info、CONSTANT_Class_info);这个字节之后是包含常量内容的若干个字节(CONSTANT_Utf8_info)。
 
java基本常量的定义方式:
  • 字节代码中只包含基本类型: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;>
4、域结构
u2 访问控制标记和属性修饰符
u2 名称的常量的序号
u2 类型描述符的常量的序号
u2 属性的个数
attribute_info 包含属性信息的数组
如:private int value 域值     
name cp_info_#5<value>
Descritpor: cp_info_#6<I>
Acess flags: 0x0002[private]
省略method_info,因为与field_info结构相同
如:public int getValue()
name cp_info_#24<getValue>
Descriptor cp_info_#25<()I>
Acess flags 0x0001[ public ]
 
5、属性
介绍完了类、域和方法等基本信息的表示,接下来其他的信息都由属性来表示,本质上就是一个名值对。
u2 属性名称对应的常量序号
u4 属性值得字节数组的长度
不定长 属性值得字节数组

java7:核心技术与最佳实践读书笔记——字节代码格式的更多相关文章

  1. java7:核心技术与最佳实践读书笔记——对象生命周期

    流程:字节码文件(.class) -> 类加载 -> 类链接 -> 类初始化 -> 对象初始化 -> 对象创建 -> 对象使用 -> 对象回收 . 1.Jav ...

  2. java7:核心技术与最佳实践读书笔记——类加载

    流程:class -> 加载 ->  jvm虚拟机 -> 链接 . 一.类加载器概述 1.引出      类加载器也是一个java类,java.lang.ClassLoader类是所 ...

  3. 《深入理解Java7核心技术与最佳实践》读书笔记(1.1)---Project Coin介绍

    OpenJDK中的Coin项目(Project Coin)的目的就是为了收集对Java语言的语法进行增强的建议.在Coin项目开始之初,曾经广泛地向社区征求提议.在短短的一个月时间内就收到将近70条提 ...

  4. php核心技术与最佳实践(笔记一)

    1.1面向对象的型与本 类是对象的抽象组织,对象是类的具体存在. 1.1.1对象的形 <?php class Person{ public $name; public $gender; publ ...

  5. PHP核心技术与最佳实践——全局浏览

    难得买到并喜欢一本好书,‘PHP核心技术与最佳实践’. 几天时间,先看了个大概,总结一下整体是什么样子的,怎么看怎么学. 1.总共14章: 2.第1.2章讲PHP的OOP: 其中第一章侧重于PHP的O ...

  6. 《深入理解OSGi:Equinox原理、应用与最佳实践》笔记_1_运行最简单的bundlehelloworld

    <深入理解OSGi:Equinox原理.应用与最佳实践>笔记_1_运行最简单的bundlehelloworld 买了周大大的OSGI的书看 先前完全没有基础 就靠这本书看看学学 顺便记一些 ...

  7. 温习《PHP 核心技术与最佳实践》这本书

    再次看这本书,顺手提炼了一下大致目录,以便后续看见目录就知道大概讲的些什么内容 PHP 核心技术与最佳实践 1.面向对象思想的核心概念 1.1 面向对象的『形』与『本』 1.2 魔术方法的应用 1.2 ...

  8. 《深入理解Java 7核心技术与最佳实践》读书笔记(2) Java语言动态性引言

    Java语言是一种静态类型的编程语言.静态类型的含义是指在编译时进行类型检查.Java源代码中的每个变量的类型都要显式地进行声明.所有变量.方法的参数和方法返回值的类型在程序运行之前就必须是已知的.J ...

  9. JavaScript设计模式与开发实践——读书笔记1.高阶函数(下)

    上部分主要介绍高阶函数的常见形式,本部分将着重介绍高阶函数的高级应用. 1.currying currying指的是函数柯里化,又称部分求值.一个currying的函数会先接受一些参数,但不立即求值, ...

随机推荐

  1. MySQL个人用户的安装配置详解

    1. 我的版本是 MySQL 5.7.26.0 ,因为据说 MySQL 8 的性能虽然强悍,但是兼容性还是有问题,而且发布时间不够长,没有普及,就暂时用着5.7版本. (1) 下载地址,选择使用msi ...

  2. Sublime Markdown预览插件安装流程

    使用方法 在sublime中已编辑好的markdown使用快捷键 Alt+M 即可在浏览器预览效果. 需要安装的插件 Markdown Editting:主要用来做 Markdown 编辑时的语法高亮 ...

  3. python与统计(龙族版)

    因为我很喜欢龙族,额........我也很喜欢python这门语言.然后就结合了一下,用python了解了一下龙族四本书的人物出场次数及排名. <龙族1火之晨曦> 路明非 1877 诺诺 ...

  4. eNSP V100R002C00B500 Setup模拟CE6800

    本人操作系统:Windows7  64 下载需要的安装包: eNSP V100R002C00B500    官网下载地址:点击这里 CE6800 官网下载地址:点击这里 USG6000V        ...

  5. Node.js起一个web服务器

    开启服务: 代码如下: var http = require('http'); http.createServer(function (request, response) { // 发送 HTTP ...

  6. Flutter中的浮动按钮FloatingActionButton 及融合底部工具栏

    FloatingActionButton 简称 FAB,从字面理解可以看出,它是“可交互的浮动按钮”,其实在Flutter默认生成的代码中就有这家伙,只是我们没有正式的接触. 一般来说,它是一个圆形, ...

  7. Unity 实现橡皮擦效果

    我所实现的橡皮擦效果是设置图片某点的像素的透明度为0,来简单实现擦除效果的: 下面是效果 首先需要注意两点:1:设置 Main Camera 的 projection 属性为Orthographic ...

  8. DNS域名解析系统_1

    DNS服务概述: DNS的模式为C/S模式 DNS(Domain Name System)域名系统,在TCP/IP网络中有非常重要的地位,能够提供域名与ip地址的解析服务. DNS是一个分布式数据库, ...

  9. Volatility取证使用笔记

    最近简单的了解了一下Volatility这个开源的取证框架,这个框架能够对导出的内存镜像镜像分析,能过通过获取内核的数据结构,使用插件获取内存的详细情况和运行状态,同时可以直接dump系统文件,屏幕截 ...

  10. sql注入01

    1.SLQ:操作数据 数据库结构 create/drop database create/alter/drop table 数据库内容 insert values语句 insert into tabl ...