Class文件结构介绍[访问标志,类索引,父类索引,接口索引集合]

举报
波波烤鸭 发表于 2022/03/30 01:36:05 2022/03/30
【摘要】 访问标志   在常量池结束后,紧接着的两个字节代表访问标志(access_flags),这个标志用于识别一些类或者接口层次的访问信息,包括:这个Class是类还是接口,是否定义为public类型,是否定...

访问标志

  在常量池结束后,紧接着的两个字节代表访问标志(access_flags),这个标志用于识别一些类或者接口层次的访问信息,包括:这个Class是类还是接口,是否定义为public类型,是否定义为abstract类型,如果是类的话是否被声明为final等,

标志名称 标志值 含义
ACC_PUBLIC 0x0001 是否为public类型
ACC_FINAL 0x0010 是否被声明为final,只有类可以设置
ACC_SUPER 0x0020 是否允许使用invokespecial字节码指令的新语意,invokespecial指令的语意在JDK1.0.2发生过改变,为了区别这条指令使用哪种语意,JDK1.0.2之后编译出来的类的这个标志必须为真
ACC_INTERFACE 0x0200 标识这是一个接口
ACC_ABSTRACT 0x0400 是否为abstract类型,对于接口或者抽象类,此标志为真,其它类型为假
ACC_SYNTHETIC 0x1000 标识这个类并非由用户代码生成
ACC_ANNOTATION 0x2000 标识这是一个注解
ACC_ENUM 0x4000 标识这是一个枚举

注意:access_flags中一共有16个标志位,此处只列举了其中8个。
定义此类:

public final  class Test2 {

	private static final String NAME="bobo";
	
	private int age = 18;
	
	public void fun1(){
		int b = 20;
		int c = 30;
		int d = b+c+age;
		System.out.println(d);
	}
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

访问标志对应的信息
在这里插入图片描述

  标识结果的值为0x0031,是多标识符组成,即由多个标识符的值累加得来。因为标识符对应的值的特殊性,值累加后的结果可以唯一定位由哪些标识符组成,常见的0x0021只有ACC_SUPER和ACC_PUBLIC的值累加才能得到,而上面的0x0031只有ACC_SUPER与ACC_FINAL与ACC_PUBLIC的值累加后得到。

类索引,父类索引与接口索引集合

  类索引(this_class)和父类索引(super_class)都是一个u2类型的数据,接口索引计数器也是一个u2类型的数据,接口索引集合则是一组u2类型的数据集合,Class文件中的这几项数据来确定这个类的继承关系

类索引

  确定当前类的全限定名
在这里插入图片描述
在这里插入图片描述

父类索引

  确定当前类的父类的全限定名。由于java单继承的原则,所以父类只可能有一个;由于Object是所有其他类的基类,所以除了Object类本身的super_class为0意外,其余的所有类的super_class都不为0.
在这里插入图片描述

接口索引集合

  按照当前类implements(或者当前接口extends)的接口顺序,从左往右排列在接口的索引集合中。

public final  class Test2 implements Serializable,Runnable{

	private static final String NAME="bobo";
	
	private int age = 18;
	
	public void fun1(){
		int b = 20;
		int c = 30;
		int d = b+c+age;
		System.out.println(d);
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		
	}
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

对应的接口索引:
在这里插入图片描述

小结:
  类索引的直接值,父类索引的直接值,接口索引集合中的索引的直接值,代表的是一个常量池中的索引值,该索引值对应为一个CONSTANT_Class_info , CONSTANT_Class_info 又指向CONSTANT_Utf8_info,CONSTANT_Utf8_info中存储着全限定名字符串信息。

参考《深入理解Java虚拟机》

文章来源: dpb-bobokaoya-sm.blog.csdn.net,作者:波波烤鸭,版权归原作者所有,如需转载,请联系作者。

原文链接:dpb-bobokaoya-sm.blog.csdn.net/article/details/88431814

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。