Анализ структуры файла класса
1. Обзор структуры файла класса
2. Описание каждого элемента данных
тип |
название |
количество |
инструкция |
u4 |
magic |
1 |
Магическое число: определить, является ли файл файлом класса |
u2 |
minor_version |
1 |
Младший номер версии файла класса |
u2 |
major_version |
1 |
Основной номер версии файла Class: экземпляр JVM может поддерживать только файлы Class с номерами версий в пределах определенного диапазона (которые могут быть обратно совместимыми). |
u2 |
constant_pool_count |
1 |
Количество постоянных таблиц |
cp_info |
constant_pool |
constant_pool_count-1 |
Постоянный пул: он понимается как хранилище ресурсов файла класса, а другие элементы данных в конце могут относиться к содержимому постоянного пула. |
u2 |
access_flags |
1 |
Информация о флаге доступа к классу: используется для указания прав доступа и основных атрибутов этого класса или интерфейса. |
u2 |
this_class |
1 |
Постоянный индекс, указывающий на текущий класс: полное имя, используемое для идентификации этого класса. |
u2 |
super_class |
1 |
Индекс константы для родительского класса: полное имя родительского класса, используемое для определения этого класса. |
u2 |
interfaces_count |
1 |
количество интерфейсов |
u2 |
interfaces |
interfaces_count |
Постоянный индекс интерфейса: используется для описания того, какие интерфейсы реализует этот класс. |
u2 |
fields_count |
1 |
Количество полевых таблиц |
field_info |
fields |
fields_count |
Коллекция таблиц полей: описывает все поля, объявленные текущим классом или интерфейсом. |
u2 |
methods_count |
1 |
Количество методических листов |
method_info |
methods |
methods_count |
Коллекция таблиц методов: описывает только методы, объявленные в текущем классе или интерфейсе, за исключением методов, унаследованных от родительского класса или родительского интерфейса. |
u2 |
attributes_count |
1 |
Количество листов свойств |
attributes_info |
attributes |
attributes_count |
Коллекция таблиц атрибутов: используется для описания некоторой информации, относящейся к сцене, такой как информация об инструкциях байт-кода и т. д. |
3. Шестнадцатеричный разбор файла класса
3.1 Магические числа.
- Файл класса начинается с 4 байтов, определенных как Magic Number;
- Единственная роль: определить, является ли файл файлом класса;
- Магический номер может быть выбран свободно, если он не используется широко и не вызовет путаницы, так что он не будет нераспознан из-за изменения расширения; магические числа существуют в заголовке многих других типов файлов, таких как gif, jpeg и т. д.
- Магический номер файла класса «0xCAFEBABE» (кофе, детка) по сравнению с ClassFileTest.class следующим образом:
3.2 Анализ таблицы методов
00 01 访问控制符 public
00 11 这里11是16进制转10进制为17,对应 Constant pool: #17 = Utf8 bar
00 0b 描述符0b是16进制转10进制为11,对应 Constant pool: #11 = Utf8 ()V
翻译过来:public void bar()
00 01 表示有1个属性表attribute_count
属性表attribute_info(u2,u4,u1*length)
00 0c 表示attribute_name_index,索引,这里0c是16进制转10进制为12,对应 Constant pool: #12 = Utf8 Code
00 00 00 38 表示attribute_length,代码占的大小,这里38是16进制转10进制为56,表示bar()方法占了56个字节
00 02 表示max_stack最大栈深是2
00 01 表示max_locals最大变量数是1
00 00 00 0a 表示code_length代码行数,这里0a是16进制转10进制为10
args_size 方法的参数有多少个(默认是this,如果方法是static那么就是0)
对应字节码
00 02 00 01 00 00 00 0a b2 00 02 b2 00 03 b6
00 04 b1 00 00 00 02 00 0d 00 00 00 0a 00 02 00
00 00 0f 00 09 00 10 00 0e 00 00 00 0c 00 01 00
00 00 0a 00 0f 00 10 00 00
b2 getstatic
00 nop
03 iconst_0
b6 invokevirtual
04 iconst_1
本地行号表
LineNumberTable:
line 15: 0
line 16: 9
本地变量表
LocalVariableTable:
Start Length Slot Name Signature
0 10 0 this Lcom/cecjx/TestM;
Start+Length 表示一个本地变量的作用域(0对应行是15,10对应行是17||即表示在该方法中,该变量的作用范围是15行到17行)
Slot 表示几个槽存储
Name 表示简单名字
签名
Signature
伪泛型。
- Инициализация статической переменной
static {};
descriptor: ()V
flags: ACC_STATIC
Code:
stack=1, locals=0, args_size=0
0: iconst_2
1: putstatic #3 // Field m:I
4: return
LineNumberTable:
line 12: 0