目录
class文件(JVM生态体系的基础构成之一)
字节码(bytecode)文件
–字节码文件结构
常量池
–字节码生成
-字节码指令
–字节码操作ASM
–字节码增强
–字节码反编译和混淆
JVM指令由操作码和零至多个操作数组成
JVM的指令集是基于栈而不是寄存器
class文件(JVM生态体系的基础构成之一)
字节码(bytecode)文件
–class文件是Java“一次编译,到处运行”的基础
–class文件具备平台无关性,由JVM执行
–每个class文件包含了一个类或接口或模块的定义
–class文件是一个二进制文件,由JVM定义class文件的规范
–任何满足这种规范的class文件都会被JVM加载运行
–class文件可以由其他语言编译生成,甚至不用程序语言直接生成
–JDK版本不同,所编译出.class文件略有不同
–字节码文件结构
class文件构成
–采用类似于C语言结构体的结构来表示数据
–包括两种数据类型
- •定长数据:无符号数,u1, u2, u4 (分别代表1个字节、2个字节、4个字节的无符号数)•不定长数据:由多个无符号数组成,通常在数据的前面给出其长度
常量池
主要存放两大类常量
–字面量
•如文本字符串、final的常量值等
–符号引用
•类和接口的全限定名
•字段的名称和描述符
•方法的名称和描述符
–字节码生成
•javac,编译器API, 其他编译器API(如Eclipse JDT)
-字节码指令
–字节码操作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操作数栈