类型 标志 描述
由于Class文件中,方法、字段都需要引用CONSTANT_Utf8_info型常量来描述名称,所以CONSTANT_Utf8_info型常量的最大长度就是Java中方法、字段名的最大长度。也就是length的最大长度,即u2能表达的最大值:65535。所以如果Java程序中如果定义了超过64KB英文字符的变量或方法名,将无法编译。

访问标志:在常量池之后,紧接着是两个字节代表的访问标志(access_flag),这个标志表示类或者接口的访问信息。
包括:这个Class是类还是接口;是否定义为public;是否定义为abstract等等。如图:
标志名称 标志值 含义
如上TestClass类代码,不是接口、枚举和注解,被public关键字修饰但没有声明为final和abstract。因此它的ACC_PUBLIC,ACC_SUPER 标志位为真,而ACC_FINAL、ACC_INYERFACE、ACC_ABSTRACT、ACC_ANNOTATION、ACC_ENUM等标志为假。因此他的access_flags的值为:0x0001 + 0x0020 = 0x0021;
类索引、父类索引与接口索引集合:类索引(this_class)、父类索引(super_class)都是一个u2类型的数据,而接口索引集合(interfaces)是一组u2类型的数据的集合,Class文件中由这三项数据来确定类的继承关系。类索引用于确定类的全限定名,父类索引用于确定类的父类的全限定名。由于Java不允许多重 继承,所以父类索引只有一个,除了java.lang.Object以外,所有的Java类都有父类,因此除了java.lang.Object外,所有的Java类的父类索引都不为0。接口索引集合用来描述这个类实现了哪些接口。类索引和父类索引都用一个u2的索引值表示,他们各自指向一个类型为CONSTANT_Class_info的类描述符常量,通过CONSTANT_Class_info类型的常量中的索引就能找到定义在CONSTANT_Utf8_info类型中的全限定名字符串。对于接口索引集合,入口的第一项是u2类型的数据为接口计数器(interfaces_count),表示索引表的容量。如果该类没有实现任何接口,则该计数器值为0,后面接口的索引表不占用任何字节。
字段表集合:字段表(field_info)用于描述类或者接口中声明的变量,换言之* 是对字段的定义。字段(field)包括类变量以及实例级变量,但是不包括在方法内部声明的局部变量。关于描述字段可以包含的信息有:字段的作用域(public、private、protect修饰符)、是实例变量还是类变量(staic)、可变性(final)、并发可见性(volatile)、可否被序列化(transient)、字段数据类型(基本类型、对象、数组)、字段名称。其中,各个修饰符都是布尔值,而字段名字、数据类型,只能引用常量池中的常量来描述*。
字段表结构如图:
类型 名称 数量
字段表修饰符放在access_flags项中,他与类中的access_flags非常类似,都是一个u2的数据类型。而name_index和descriptor_index,他们都是对常量池的引用,分别代表字段的简单名称以及字段和方法的描述符。
全限定名:包名加类名。例:在常量池中:org/fenixsoft/TestClass(org.fenixsoft.TestClass),仅仅是把“.”换成了“/”。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-62811-2.html
有种时尚大片的赶脚~
美国有全世界最顶尖的科技技术