7263 6546 696c 6501 0009 4465 6d6f 2e6a

6176 610c 0007 0008 0700 170c 0018 0019

0100 0b48 656c 6c6f 2057 6f72 6c64 0700

1a0c 001b 001c 0100 0444 656d 6f01 0010

6a61 7661 2f6c 616e 672f 4f62 6a65 6374

0100 106a 6176 612f 6c61 6e67 2f53 7973

7465 6d01 0003 6f75 7401 0015 4c6a 6176

612f 696f 2f50 7269 6e74 5374 7265 616d

3b01 0013 6a61 7661 2f69 6f2f 5072 696e

7453 7472 6561 6d01 0007 7072 696e 746c

6e01 0015 284c 6a61 7661 2f6c 616e 672f

5374 7269 6e67 3b29 5600 2100 0500 0600

0000 0000 0200 0100 0700 0800 0100 0900

0000 1d00 0100 0100 0000 052a b700 01b1

0000 0001 000a 0000 0006 0001 0000 0001

0009 000b 000c 0001 0009 0000 0025 0002

0001 0000 0009 b200 0212 03b6 0004 b100

0000 0100 0a00 0000 0a00 0200 0000 0300

0800 0400 0100 0d00 0000 0200 0e

首先,需要明确字节码文件是以十六进制编码的,十六进制是以0x表示的,接下来,我们以“Hello World”的字节码文件为例,对这七个部分进行逐步的分析。



访问标志

----



在常量池的末尾,接下来的两个字节表示类或接口的access\_flags。这里的数据是0021。



![]()



此标志用于标识类或接口级别的访问信息,包括类是类还是接口、是否定义为公共类型、是否定义为抽象类型等等。



类索引、父类索引、接口索引

-------------



在访问标记之后,它是类索引、父索引和接口索引的数据,其中数据是:0005000600。



类索引和父索引都是u2类型的数据,而接口索引集是一组u2类型的数据。这三个数据用于确定类文件中这个类的继承关系。



类索引。类索引用于确定该类的完全限定名称,该名称由类型u2的数据表示。这里的类索引是0005,表示它指向常量池中的第五个常量。根据前面的分析,我们知道第五个常量的最终信息是Demo类。



亲本索引。父索引用于确定该类的父类的完全限定名称,该名称由类型u2的数据表示。这里的父索引是0006,表示它指向常数池中的第六个常数。通过前面的分析,我们知道第六个常量的最终信息是Object类。因为它不继承任何类,所以Demo类的父类是默认的对象类。



接口索引。接口索引集用于描述哪些类实现哪些接口,这些接口索引集按照实现语句之后的接口顺序从左到右排列(如果类本身是接口,那么它应该是扩展语句)。对于接口索引集,第一个条目是作为interface\_count的U2类型数据,它表示索引表的容量,后面跟着所有接口信息。如果类没有实现任何接口,则计数器值为0,并且后一个接口的索引表不占用任何字节。  


### 最后

很多程序员,整天沉浸在业务代码的 CRUD 中,业务中没有大量数据做并发,缺少实战经验,对并发仅仅停留在了解,做不到精通,所以总是与大厂擦肩而过。