从.java到.class

2019-01-19  本文已影响0人  FightForFuture
一、class 类文件

class文件是一组以8位字节为基础的二进制流,中间没有任何分隔符,所以数据的含义和顺序都被严格限定。
class 文件使用两种数据类型保存数据:

  1. 无符号数(有符号数有正负之分)
  2. 表(由无符号数和ITA表构成)

class文件本质就是一张表

二、class类文件结构
const #7 = Asciz        <init>;
const #8 = Asciz        ()V;
const #9 = Asciz        Code;
const #10 = Method      #3.#11; //  java/lang/Object."<init>":()V
const #11 = NameAndType #7:#8;//  "<init>":()V

其中,第11常量,引用了常量7、8组成了NameAndType常量,
常量7是方法名称,常量8是方法描述符

对于数组类型,每一维度使用一个前置“[”字符描述,如String[][]二维数组,被记录为"[[Ljava/lang/String";int[]被记录为"[I"

code指令执行过程中的数据交换、方法调用等操作都是基于操作栈的,如invokespecial,这条指令作用是以栈顶的reference类型的数据所指向的对象作为方法接收者,调用此对象的实例构造器方法、父类方法、private方法。

注意点:

  1. java中,overload除与原方法同名之外,还要求与原方法特征签名不同,特征签名就是一个方法中各个参数在常量池中的字段符号引用的集合,而返回值不包含在特征签名中
  2. this关键字
    编译时把this关键字的访问,转换为普通方法参数的访问,调用时自动传入当前实例。局部变量表中也会预留第一个slot来存放对象实例的引用。
  3. LineNumberTable属性
    使用位置:Code属性中
    用于描述java源代码行号和字节码行号(字节码的偏移量)之间的对应关系。由-g:lines控制,如果选择不生成,堆栈中将不会显示出错的行号(源代码行号)。
  4. LocalVariableTable属性
    使用位置:Code属性
    用以描述栈帧中局部变量表中变量与java源码定义变量的关系。由-g:vars控制,如果选择不生成,其他人引用这个方法时,所有参数名称都会丢失。
三、字节码指令

一个字节长度,由操作码+操作数构成
大部分指令都没有支持byte、char、short等,因为编译器在编译期间扩展为int类型数据

上一篇下一篇

猜你喜欢

热点阅读