请选择 进入手机版 | 继续访问电脑版

热点推荐

查看: 56|回复: 2

03-字节码的结构

[复制链接]
  • TA的每日心情
    开心
    昨天 16:10
  • 签到天数: 286 天

    [LV.8]以坛为家I

    3万

    主题

    3万

    帖子

    10万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    103904
    发表于 2020-2-14 19:36:47 | 显示全部楼层 |阅读模式
    字节码的整体结构

    字节码整体分为10个部分
    所占字节分类备注4个字节Magic Number(魔数)正确字节码标识为,由Java之父定义,固定的是CAFE BABE2 + 2个字节Minor Version + Major Version编译的JDK版本号,Minor Version为小版本,Major Version为大版本。但不包括Update版本2 + N个字节Constant Pool(常量池)并不是都是常量,而是指字节码中的一块数据字典,其他地方仅仅引用常量池内的地址。前2个字节是用来表示当前常量池的长度。常量池内常量个数为常量池长度 - 1,因为常量池是从下标1开始的。下标0是保留位,默认保存null。2个字节Access Flag访问标识(ACC_Public、ACC_Static等)2个字节This Class Name类名(全路径限定名称),是一个引用直接引用常量池内的内容2个字节Super Class Name父类名,是一个引用直接引用常量池内的内容2 + N个字节Interfaces当前类所实现的全部接口2 + N个字节Fields当前类所拥有的所有字段2 + N个字节Methods当前类所拥有的所有方法(每个方法都会有一个属性叫Code,里面是该方法的指令集。一般来说每个Code还会带有2个属性,LineNumberTable和LocalVaribleTable来分别记录字节码对应源码的行号和方法的变量表)2 + N个字节Attrubites所有属性(最常见的就是Source File)在上表中,Fields、Methods等属性均是2 + N个字节,其中固定的2个字节表示的当前分类的元素个数,如果为0则不会存在后面的N个字节,而是直接进入下一个分类的内容。
    描述符

    另外对于常量池中还有一部分内容需要特别强调,JVM对每种数据类型及每个方法都存在对应的描述符用来精简字节码的结构和长度,下面给出常用的描述符
    8种基本类型 + void

    Java类型描述符ByteBShortSIntILongJFloatFDoubleDCharCBooleanZVoidV对象类型

    L+对象的权限定名称(其中的.替换成/)+ ;
    如Object的对象描述符为:Ljava/lang/Object;
    String的对象描述符为:Ljava/lang/String;
    数组类型

    以 '[' 开头后面接数组的元素类型,如果是基本类型就是 [ + 对应的基本类型的描述符,如果是对象类型数组则是 [ + 对象描述符。示例如下:
    基本类型:int[] -> [I, byte[] -> [B
    对象类型:Integer[] -> [Ljava/lang/Integer; , String[]
    方法的描述符

    方法描述符是对方法的返回值+参数进行精简,对方法名并不产生影响。其结构是(方法参数类型描述符)+返回值类型的描述符。示例如下:
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    62

    帖子

    124

    积分

    注册会员

    Rank: 2

    积分
    124
    发表于 2020-3-25 11:55:13 | 显示全部楼层
    java8 optional
    回复

    使用道具 举报

    该用户从未签到

    5

    主题

    67

    帖子

    139

    积分

    注册会员

    Rank: 2

    积分
    139
    发表于 2020-9-14 04:46:21 | 显示全部楼层
    赞一个,还能说什么呢
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    快速回复 返回顶部 返回列表