范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

一张图分析类的字节码结构

  什么是class
  Class文件是一组以8个字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在文件之中,中间没有添加任何分隔符,这使得整个Class文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在。当遇到需要占用8个字节以上空间的数据项时,则会按照高位在前的方式分割成若干个8个字节进行存储。
  无符号数属于基本的数据类型,以u1、u2、u4、u8来分别代表1个字节、2个字节、4个字节和8个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值或者按照UTF-8编码构成字符串值。
  表是由多个无符号数或者其他表作为数据项构成的复合数据类型,为了便于区分,所有表的命名都习惯性地以"_info"结尾。表用于描述有层次关系的复合结构的数据,整个Class文件本质上也可以视作是一张表,这张表数据项按严格顺序排列构成。
  接下来以个实际的class来分析类的字节码结构。先来看看一个简单的类public class JavapTest {      private int count;      public int  sum(int x){         count+=x;         return count;     }     static class Test{         String x="test";     } }
  通过javap 可得到下面内容public class com.zl.basic.JavapTest   minor version: 0   major version: 52   flags: ACC_PUBLIC, ACC_SUPER Constant pool:    #1 = Methodref          #4.#18         // java/lang/Object."":()V    #2 = Fieldref           #3.#19         // com/zl/basic/JavapTest.count:I    #3 = Class              #20            // com/zl/basic/JavapTest    #4 = Class              #21            // java/lang/Object    #5 = Class              #22            // com/zl/basic/JavapTest$Test    #6 = Utf8               Test    #7 = Utf8               InnerClasses    #8 = Utf8               count    #9 = Utf8               I   #10 = Utf8                  #11 = Utf8               ()V   #12 = Utf8               Code   #13 = Utf8               LineNumberTable   #14 = Utf8               sum   #15 = Utf8               (I)I   #16 = Utf8               SourceFile   #17 = Utf8               JavapTest.java   #18 = NameAndType        #10:#11        // "":()V   #19 = NameAndType        #8:#9          // count:I   #20 = Utf8               com/zl/basic/JavapTest   #21 = Utf8               java/lang/Object   #22 = Utf8               com/zl/basic/JavapTest$Test {   public com.zl.basic.JavapTest();     descriptor: ()V     flags: ACC_PUBLIC     Code:       stack=1, locals=1, args_size=1          0: aload_0          1: invokespecial #1                  // Method java/lang/Object."":()V          4: return       LineNumberTable:         line 3: 0    public int sum(int);     descriptor: (I)I     flags: ACC_PUBLIC     Code:       stack=3, locals=2, args_size=2          0: aload_0          1: dup          2: getfield      #2                  // Field count:I          5: iload_1          6: iadd          7: putfield      #2                  // Field count:I         10: aload_0         11: getfield      #2                  // Field count:I         14: ireturn       LineNumberTable:         line 8: 0         line 9: 10 } SourceFile: "JavapTest.java" InnerClasses:      static #6= #5 of #3; //Test=class com/zl/basic/JavapTest$Test of class com/zl/basic/JavapTest
  我们再来逐个字节分析一下,就知道上面内容是怎么来的。用Hex Editor Neo打开JavapTest.class.
  JavapTest.class
  图中的红色数字代表一个项,作为代号我们来逐个分析一下。
  1 魔数 确定这个文件是否为一个能被虚拟机接受的Class文件
  2 次版本号
  3 主版本号,34换算10进制为52
  4 常量池数量,0017 换算为10进制为23 ,常量池计数从1开始,所以共有22个常量
  5 第一项常量 访问标志0a,代表方法引用 ,0004(4) ,0012(18)分别指向第4,18个常量
  6 第二项常量 访问标志09 代表字段引用 ,0003(3),0013(19)分别指向第3,19个常量
  7 第三个常量 访问标志07 代表类的全限定名0014(20)指向第20个常量
  8 第四个常量 访问标志07 代表类的全限定名0014(21)指向第21个常量
  9 第五个常量 访问标志07 代表类的全限定名0014(22)指向第22个常量
  10 第6个常量 访问标志01为 utf8字符,0004代表有4个字节 Test
  11 第7个常量 访问标志01为 utf8字符,000c代表后面12个字节是该常量的值 InnerClasses
  12 第8个常量 访问标志01为 utf8字符,0005代表后面5个字节是该常量的值 count
  13 第9个常量 访问标志01为 utf8字符,0001代表后面1个字节是该常量的值 I
  14 第10个常量 访问标志01为 utf8字符,0006代表后面6个字节是该常量的值
  15 第11个常量 访问标志01为 utf8字符,0003代表后面3个字节是该常量的值 ()V
  16 第12个常量 访问标志01为 utf8字符,0004代表后面4个字节是该常量的值 Code
  17 第13个常量 访问标志01为 utf8字符,000f代表后面15个字节是该常量的值 LineNumberTable
  18 第14个常量 访问标志01为 utf8字符,0003代表后面3个字节是该常量的值 sum
  19 第15个常量 访问标志01为 utf8字符,0004代表后面4个字节是该常量的值 (I)I
  20 第16个常量 访问标志01为 utf8字符,000a代表后面10个字节是该常量的值 SourceFile
  21第17个常量 访问标志01为 utf8字符,000e代表后面14个字节是该常量的值 JavapTest.java
  22 第18个常量 访问标志0c为 NameAndType常量,000a(10),000b(11)分别执行第10和11个常量
  23 第19个常量 访问标志01为 NameAndType常量,000a(8),000b(9)分别执行第8和9个常量
  24 第20个常量 访问标志01为 utf8字符,0016代表后面22个字节是该常量的值 com/zl/basic/JavapTest
  25 第21个常量 访问标志01为 utf8字符,0010代表后面16个字节是该常量的值 java/lang/Object
  26 第22个常量 访问标志01为 utf8字符,001b代表后面22个字节是该常量的值 com/zl/basic/JavapTest$Test
  27 访问标志 0021 ACC_PUBLIC、ACC_SUPER标志为真 0001|0020=0021
  28 类索引 0003 指向第三个常量
  29 父类索引 0004 指向第四个常量
  30 接口索引 0000 代表没有实现接口
  31 0001 代表字段数量1,0002 代表private,0008代表字段名称 指向常量池的 I 表示int,0009代表字段描述符 指向常量池 9 即count
  方法访问标志说明
  32 0002 代表有两个方法,0001代表public,000a 指向第十个常量,000b指向第11个常量,0001代表有一个属性,属性名称的索引值为0x000c,对应常量为"Code",说明此属性是方法的字节码描述,0000001d(29)代表代码长度,0001是max_stack操作数栈最大深度,0001局部变量表所占的Slot,接下来的四个字节(00000005)是代码长度,字节码长度为5,接下来的5个字节2A B70001 B1,接下来0000两个自己表示式异常处理表,这里没有异常所以是0,接着0001属性表示有一个属性,属性索引为000d(13) 在常量池中的引用是LineNumberTable。00000006是属性长度,表示后面6字节是它的长度。 0001是行号表长度1,包含start_pc和line_number两个u2类型的数据项,前者是字节码行号,后者是Java源码行号(0000:字节码行号,0003:java源码行号)
  33.是第二个方法,0001代表public,000e 指向第11个常量,000f指向第15个常量,0001代表有一个属性,属性名称的索引值为0x000c,对应常量为"Code",0000002b(43)是代码长度,0003,0002分别是栈深度和局部变量表。0000000f(15)字节码长度,2a59b400021b60b500022ab40002ac, 0000yi异常处理表,0001有一个属性,000d(13)LineNumberTable,0000000a(10)属性长度,000200000008000a0009(0002行长度为2,0000:0008 字节码和源码行号,第二个000a:0009),
  方法属性完了继续是内的属性,接下来的0002表示有量个类属性。0010表示指向16号常量SourceFile,00000002是属性长度,0011指向17号常量即JavapTest.java,
  0007指向第7个常量池InnerClasses,0000000a(10)属性长度,0001表示内部类数量为1.
  0005内部内索引5,0003外部类索引3,内部类名索引指向第6个常量池,0008内部内访问标志是静态标志
  至此,JavapTest类的每个字节都分析清楚了,工作中可能用不到这些,但是作为程序员的你一定要知道这个class是怎么组织的很重要。深入理解java是必不可少的。

亚运智能看,热线对面聊,中国移动心级服务暖人心手机扫码线上购物预约挂号视频通话无时不刻无处不在的通信网络服务,让小手机连接起大世界,也给我们的工作和生活带来便利。随着亚运时刻的临近,我们的通信服务会有哪些提升与变化,将会给人们防网游沉迷要从未成年人心理需求破题在移动互联时代,不少未成年人热衷于玩网络游戏,有的甚至大家组队一起玩。其中的原因可想而知,网游画面炫酷设计精巧玩法多样体验感强,作为一种娱乐方式,有许多吸引人的地方。而且,当下的网江津石笋山雄峰如笋立玉屏,孔雀湖波光粼粼,沁人心脾石笋山属云雾山系,位于重庆江津区石门镇北部永安境内,距江津34公里,永川市区36公里。山中有男石笋山和女石笋山,分别为两座最高山峰,海拔约700米。男女石笋山遥相呼应,山势纤巧秀丽美国银行危机拜登甩锅特朗普,欧洲人心惶惶美国硅谷银行和签名银行相继倒闭,引发了全球金融市场的恐慌。这是美国历史上规模第二大和第三大的银行倒闭事件,也是自2008年金融危机以来最严重的金融动荡。美国政府紧急出台了一系列措施食盐味精和碱面,本是一个娘生的,为何好坏善恶截然不同?食盐,碱面,味精这三种东西,其实都是一个娘生的。但是它们品行善恶截然不同。首先说食盐,化学名就是氯化钠,碱面就是碳酸钠,味精就是谷氨酸钠,在化学上,它们都是由金属离子和酸根组成,有大快人心!WCBA总决赛G3裁判恐被重罚,李月汝重伤,展淑萍重返辽宁?大快人心!WCBA总决赛G3裁判恐被重罚,李月汝重伤,展淑萍重返辽宁?北京时间2023年3月12日,WCBA总决赛G3对决在四川女篮主场打响,对阵的双方是内蒙古女篮和四川女篮,此前忆往事,曾经沧海难为水(之三)仁者(原创)都说五六十年代的人是经历过吃苦的一代人,是因为这代人正赶上了三年自然灾害和文化大革命。贫困与愚昧交织,狂热与物质匮乏,是那个年代的交响曲。等到1979年恢复高考,大多数突破性提升扫拖性能石头自清洁扫拖机器人G20开启盲约在今年的CES上,石头科技推出了S8系列新品,其中旗舰级别的S8ProUltra凭借着出色的清洁性能受到了广泛的关注,包括thevergeCNET等海外知名媒体也对这款产品给与了很湖南车展今年有哪些新花样?3月22日新闻发布会上见分晓三湘都市报新湖南客户端全媒体记者胡锐又是熟悉的五一火爆小长假,还是湖南国际会展中心老地方!日前,2023湖南车展定档举办的消息传出后,已在业内引起巨大反响,人们纷纷猜测,一向追求模三乐堂诗歌我期待我期待一场透透彻彻的春雨润泽到大地的每一个角落我期待春潮荡涤着世间的尘埃让所有的孩子都能崇尚高尚的情怀我期待条条大道延伸到大山的深处让那里的兄妹和孩子早日跟上现代文明的脚步我期待还眼睛就是导航!只要你戴上这一智能AR隐形眼镜财联社上海3月16日讯(编辑黄君芝)随着元宇宙时代的到来,人们越来越期待虚拟现实(VR)和增强现实(AR)技术将有可能提高日常生活的便利性,以及行业生产力表现。近期,韩国联合研究所
湖北能源研究报告风光水火储互补,被低估的清洁能源平台(报告出品方作者广发证券,郭鹏,许洁)一风光水火储互补,区域综合能源平台(一)清洁能源装机占比64,总装机11。69GW三峡集团旗下区域性综合能源平台,湖北省财政厅为第二大股东。公每日优鲜大撤退,成生鲜零售发展分水岭文申屠3年亏损100亿的每日优鲜,是互联网烧钱模式在生鲜零售领域的再次折戟。每日优鲜们的试错,正终结生鲜零售的烧钱扩张,推动赛道选手和资本回归生鲜这门生意的本质一要赚钱,二要民生。硅烷小巨人崛起,宏柏新材产品矩阵扩容带动公司高速成长(报告出品方分析师开源证券金益腾龚道琳蒋跨跃)01含硫硅烷龙头企业,沿产业链横纵双向稳步扩张1。1公司纵向扩产三氯氢硅并进军光伏领域,横向拓宽硅烷品类公司是国内含硫硅烷龙头企业,具广东三姐妹个个长相不俗,却都选择削发为尼,两人已成住持我们常听人说遁入空门,意思是佛教认为世界是一切皆空的,所有都是虚无。摒弃了凡尘的种种杂念,一心修佛道就能通过自己的微弱力量,普渡芸芸众生。这是一种非常高尚的觉悟,包括现在很多人在遇夜读丨做人最忌讳的,是不从自己身上找原因绿标收听朗读音频文京博国学人非圣贤,孰能无过。在遇到问题的时候,我们的第一反应是什么呢?是把责任推卸给环境和别人,还是首先想到的,是自己的原因。事情做不成功,遇到了挫折和困难,或者愿你不求花香满衣,只求坚强不屈不求水月在手,只求安然无恙作者雨飘清荷香(河南雨小荷)岁月沧桑,花开花落间是时光的流转,是人生素笺勾勒的悲欢离合。红尘万丈,缘起缘灭间是爱情的悲欢,是光阴沉静中零落的曲终人散。烟雨落红处,谁携一缕清风,静看那年我大一这些事,仿佛在昨天。每一个场景都历历在目,印象就像烙印一样永久的科在心里。其实我也想,暂时的忘记这些不属于我的时光和记忆,去享受和期待现实的大学生活,但是三哥也是有血有肉的人,一旦一些画面,封存在记忆童年乡村暮景夕阳一个回眸乡村披上柔曼的金纱小黑狗晃着尾巴在篱笆墙下偶尔汪汪地叫上两声忠厚的老黄牛守在草堆旁一声不响地咀嚼着宁静的时光老农从田间荷锄归来晒黑的脸上泛着赤色的油光鸡仔鸭神舟十四号太空出差满2个月,外媒反常点评早已习以为常时间过得很快,自2022年6月5日发射升空至今,神舟十四号飞船已经太空出差满2个月了。按照计划,神舟十四号飞船将会在太空中飞行6个月,从时间来看,现在神舟十四号飞船的任务时间已经过新海洋的诞生地反乌托邦且异常美丽的阿贝湖,在石灰岩烟囱和地热活动下,有一种荒凉景观,有朝一日可能会形成世界的下一个海洋。阿贝湖横跨埃塞俄比亚和吉布提的边界阿贝湖横跨埃塞俄比亚吉布提边境,周围环绕这几个消失手机东西,你绝对都用过同质化无聊都一个样,这应该是大部分数码玩家对现如今手机圈的看法了,事实也确实如此,现在的手机厂商推新机的速度越来越快,导致同质化问题十分严重,想要在一众手机中来点不一样的,或许也只