本篇文章为大家展示了JVM虚拟机中Class文件的类索引、父类索引和接口索引集合是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
前面介绍了class文件,包括魔数、次版本号、主版本号、常量池和访问标志.接下来的就是用于确定这个类的继承关系的类索引(thisclass)、父类索引(superclass)与接口索引集合(interfaces)这三项。
类索引、父类索引和接口索引集合都按顺序排列在访问标志之后,类索引用于确定这个类的全限定名,父类索引用于确定这个类的父类的全限定名。由于Java语言不允许多继承,因此父类索引只有一个,除了java.lang.Object之外,所有的Java类都有父类,因此除了Object外,所有Java类的父类索引都不为0。
类索引和父类索引均是u2类型的数据,它们各自指向一个类型为CONSTANTClassinfo类型的常量,通过CONSTANTClassinfo类型的常量中的索引值可以找到定义在CONSTATNUtf8info类型的常量中的全限定名字符串。
接口索引集合用来描述这个类实现了哪些接口,它是一组u2类型的数据的集合,集合中的第一项是接口计数器,表示索引表的容量。如果一个类没有实现任何接口,则该计数器值为0。
索引位置参见下图:
新建接口:
public interface HelloWord {}
这里类索引值是0x0001,也就是指向常量池中的第一项,通过查找常量池可知这个类的全限定名是com/csdn/reader/HelloWord。
类索引后的两个字节就是父类索引,同上可查找到父类索引为0x0002,对应于常量池中的第二项:
由于类实现的接口数目不确定,所以接口索引集合的描述的前部分叫做接口计数器(interfaces_count),接口计数器占用两个字节,其中的值表示着这个类实现了多少个接口,紧跟着接口计数器的部分就是接口索引部分了,每一个接口索引占有两个字节,接口计数器的值代表着后面跟着的接口索引的个数。
com.csdn.reader.HelloWord类没有实现任何接口,接口索引值为0。
来个复杂一点的:
public interface HelloWord extends StringBuilderFormattable, Serializable {}
通过javap来进行分析:
上述内容就是JVM虚拟机中Class文件的类索引、父类索引和接口索引集合是什么,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。