目录

class文件(JVM生态体系的基础构成之一)

字节码(bytecode)文件

–字节码文件结构

常量池

–字节码生成

-字节码指令

–字节码操作ASM

–字节码增强

–字节码反编译和混淆

JVM指令由操作码和零至多个操作数组成

JVM的指令集是基于栈而不是寄存器


class文件(JVM生态体系的基础构成之一)

字节码(bytecode)文件

–class文件是Java“一次编译,到处运行”的基础

–class文件具备平台无关性,由JVM执行

–每个class文件包含了一个类或接口或模块的定义

–class文件是一个二进制文件,由JVM定义class文件的规范

–任何满足这种规范的class文件都会被JVM加载运行

–class文件可以由其他语言编译生成,甚至不用程序语言直接生成

–JDK版本不同,所编译出.class文件略有不同

class bytes 显示为汉字 class字节码文件是什么_class bytes 显示为汉字

–字节码文件结构

class bytes 显示为汉字 class字节码文件是什么_字节码_02

class文件构成

–采用类似于C语言结构体的结构来表示数据

–包括两种数据类型

  • •定长数据:无符号数,u1, u2, u4 (分别代表1个字节、2个字节、4个字节的无符号数)•不定长数据:由多个无符号数组成,通常在数据的前面给出其长度

常量池

主要存放两大类常量

–字面量

•如文本字符串、final的常量值等

–符号引用

•类和接口的全限定名

•字段的名称和描述符

•方法的名称和描述符

–字节码生成

•javac,编译器API, 其他编译器API(如Eclipse JDT)

-字节码指令

class bytes 显示为汉字 class字节码文件是什么_JVM_03

–字节码操作ASM

ASM是生成、转换、分析class文件的工具包


• Core API (流模型)


–类比解析XML文件中的SAX方式


不需要读取类的整个结构,使用流式的方法来处理字节码文件


–非常节约内存,但是编程难度较大    –出于性能考虑,一般情况下编程都使用Core API


 


核心类



–ClassReader 用于读取已经编译好的.class文件



–ClassWriter 用于重新构建编译后的类



  • • 如修改类名、属性以及方法,也可以生成新的类的字节码文件

– Visitor类



  • • CoreAPI根据字节码从上到下依次处理
  • • 对于字节码文件中不同的区域有不同的Visitor,举例如下

– MethodVisitor 用于访问类方法



– FieldVisitor 访问类变量



– AnnotationVisitor 用于访问注解


• Tree API (树模型)


–类比解析XML文件中的DOM方式,把整个类的结构读取到内存中


–消耗内存多,但是编程比较简单


–通过各种Node类来映射字节码的各个区域


 

–字节码增强

•使用Instrument对字节码进行转换

–字节码反编译和混淆

 

JVM指令由操作码和零至多个操作数组成

–操作码(OpCode,代表着某种特定操作含义的数字)具体的指定编码

–操作数(Operand,操作码所需参数)

JVM的指令集是基于栈而不是寄存器

–字节码指令控制的是JVM操作数栈