目标 直接阅读字节码
魔数
- 开头前4个字节为 CAFE BABE,(两个十六进制字符为一个字节),后四个字节为Class 文件的版本号,先次版本号,后主版本号,能向下兼容,不能向后兼容,
- 之后的两个字节为常量池常量的个数,从1开始计数,在之后就是每一个常量的信息,最多64
k个 - 常见的有 14 个
- Class:tag(u1)+ name_index(u2)
- Utf8:tag(u1)+ length(u2)+ bytes(length)方法名,字段名,加上包名不能超过64k
- 基础数据类型,tag(u1)+ bytes(?)值
- 访问标志,两个字节,为标志位,用于表示类的信息,比如是否是public,final,super,interface,abstract,enum,annotation
- 类索引,父类索引,接口索引
- 字段表,访问标志,public protected private 三选一,final volatile 不能同时选择,接口中public static final 是必须的。access_flags, name_index(简单名称),descriptor_index(全限定名),attributes_count,attributes
- 方法表集合access_flags (strictfp,native,synchronized
- 属性表集合
- InnerClass
- LineNumberTable 源码与字节码对应
- LocalVariableTable
- StackMapTable
- Signature
- SourceFile
- Synthetic
每个属性都引用常量池里来表示
Code 属性,方法体的信息存储在这,code_length 长度固定
网友评论