Class文件结构介绍[访问标志,类索引,父类索引,接口索引集合]
訪問標志
??在常量池結束后,緊接著的兩個字節代表訪問標志(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個。
定義此類:
訪問標志對應的信息
??標識結果的值為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);}@Overridepublic void run() {// TODO Auto-generated method stub} }對應的接口索引:
小結:
??類索引的直接值,父類索引的直接值,接口索引集合中的索引的直接值,代表的是一個常量池中的索引值,該索引值對應為一個CONSTANT_Class_info , CONSTANT_Class_info 又指向CONSTANT_Utf8_info,CONSTANT_Utf8_info中存儲著全限定名字符串信息。
參考《深入理解Java虛擬機》
總結
以上是生活随笔為你收集整理的Class文件结构介绍[访问标志,类索引,父类索引,接口索引集合]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三种保证URL地址可信的加密方式
- 下一篇: Java单元测试框架与实践(Junit5