
Лекция 2.pptx
- Количество слайдов: 29
Лекция 2. Структура байт кода • Компиляция java в class • Byte. Code виртуальной машины Java • Структура class файла • Средства работы с class файлами и примеры. Кафедра защищенных систем связи
Компиляция программы Компилятор создает файл , содержащий версию кода виртуальной машины программы. Код виртуальной машины Java - это промежуточное представление программы, содержащее инструкции, которые будет выполнять виртуальная машина Java. Результат работы компилятора не является непосредственно исполняемым кодом. В процессе компиляции исходного кода каждый отдельный класс помещается в собственный выходной файл, названный по имени класса и получающие расширение. class. Текст программы Компилятор Javac Class файл Кафедра защищенных систем связи
Byte. Code виртуальной машины Java Байт-код Java — набор инструкций, исполняемых виртуальной машиной Java. Каждый код операции байт-кода имеет размер один байт. Виды инструкций: • Загрузка и сохранение; • Арифметические и логические операции; • Преобразование типов; • Создание и преобразование объекта; • Управление стеком; • Операторы перехода; • Вызовы методов и возврат; Кафедра защищенных систем связи
Byte. Code виртуальной машины Java Если рассматривать более детально, то формат инструкций наглядно выглядит так: Биты 8 Формат 8 8 1. Операция 2. Операция Байт 3. Операция 4. Операция SHORT Индекс Константа 5. Операция Индекс Размерность 6. Операция Индекс Параметры 7. Операция Индекс 8. Операция Константа 32 - битное смещение перехода Кафедра защищенных систем связи 0
Byte. Code виртуальной машины Java Загрузка из локальной переменной: • iload — для типа int • lload — для типа long • fload — для типа float • dload — для типа double Сохранение локальной переменной типа int: • istore_0 = 59 (0 x 3 b) • istore_1 = 60 (0 x 3 c) • istore_2 = 61 (0 x 3 d) • istore_3 = 62 (0 x 3 e) Не имеют аргументов istore = 54 (0 x 36) Имеет один аргумент Кафедра защищенных систем связи
Byte. Code виртуальной машины Java Математические операции: • iadd = 96 (0 x 60) – сложение типа int • ladd = 97 (0 x 61) – сложение типа long • fadd = 98 (0 x 62) – сложение типа float • dadd = 99 (0 x 63) – сложение типа double • imul = 104 (0 x 68) – умножение типа int public class Example { public int plus(int a) { int b = 1; return a + b; } } public int plus(int); Code: Stack=2, Locals=3, Args_size=2 0: iconst_1 1: istore_2 2: iload_1 3: iload_2 4: iadd 5: ireturn Line. Number. Table: line 5: 0 line 6: 2 Кафедра защищенных систем связи
Byte. Code виртуальной машины Java Байт – код Исходный код int a = 0; int b = 1; int c = a +b; iconst_0 istore_1 Байт – код iconst_0 istore_1 Исходный код iconst_1 istore_2 int a = 0; iload_1 iload_2 iadd istore_3 int c = 1; int b = 3; Int d = a *b + c; Кафедра защищенных систем связи iconst_3 istore_2 iconst_1 istore_3 iload_1 iload_2 imull iload_3 iadd istore_4
Byte. Code виртуальной машины Java Пример вычисления: Исходный код Byte. Code int a =2; 1. iload_1 int b =3; 2. iload_2 int c = 1; 3. imull int d =a*b + c; 4. iload_3 5. iadd 6. istore_4 1 2 (iload_1) 2 • 3 (iload_2) • 2 (iload_1) 3 6 (imull) 4 • 1 (iload_3) • 6 (imull) 5 6 Кафедра защищенных систем связи 7 Стек пуст
Class файл • Содержит байт-код, который выполняется на виртуальной машине. • Содержит информацию о классе. • Генерируется компилятором из исходного кода (. java) • Jar файл – представляет собой zip архив class файлов. Main class файл. jar файл Class файл METAINF/MANIFE ST. MF Характеристики данного. jar файла Кафедра защищенных систем связи
Структура class файл состоит из 1, 2, 4 байтовых значений: • u 1 – byte ( 1 байт ) • u 2 – long ( 2 байта) • u 4 – int ( 4 байта) Кафедра защищенных систем связи
Структура class файла Разберемся на самом тривиальном примере: package hello; public class App { public static void main(String[] args) { System. out. println("Hello world!"); } } Скомпилировав данный код, мы получим class файл. С помощью любого hexредактора откроем его. Кафедра защищенных систем связи
Структура class файла 000000010 0000020 0000030 0000040 0000050 0000060 0000070 0000080 0000090 00000 a 0 00000 b 0 00000 c 0 00000 d 0 00000 e 0 00000 f 0 0000100 0000110 00001 a 0 ca 00 00 56 75 6 e 2 f 72 76 00 1 a 70 62 67 15 74 2 f 72 00 fe 10 16 01 6 d 01 53 63 61 0 c 0 c 70 6 a 2 f 4 c 72 50 69 0 e ba be 00 00 11 08 01 00 06 00 04 43 62 65 72 00 16 28 74 72 69 65 46 69 0 c 00 07 48 65 6 c 00 1 b 00 01 00 10 65 63 74 53 79 73 6 a 61 76 65 61 6 d 72 69 6 e 6 e 74 6 c 00001 a 2 00 00 3 c 6 f 54 5 b 6 e 6 c 00 6 c 1 c 6 a 01 74 61 3 b 74 6 e 00 12 69 64 61 4 c 67 65 08 6 f 01 61 00 65 2 f 01 53 01 34 0 a 6 e 65 62 6 a 3 b 01 07 20 00 76 10 6 d 69 00 74 00 00 00 69 01 6 c 61 29 00 00 77 09 61 6 a 01 6 f 13 72 15 1 d 13 74 00 65 76 56 08 17 6 f 68 2 f 61 00 2 f 6 a 65 28 0 a 00 3 e 0 f 01 61 01 41 0 c 72 65 6 c 76 03 50 61 61 4 c 00 14 01 4 c 00 2 f 00 70 00 6 c 6 c 61 61 6 f 72 76 6 d 6 a 06 07 00 69 04 6 c 0 a 70 18 64 6 c 6 e 2 f 75 69 61 01 61 Кафедра защищенных систем связи 00 00 03 6 e 6 d 61 53 2 e 00 21 6 f 67 6 c 74 6 e 2 f 00 76 0 f 15 28 65 61 6 e 6 f 6 a 19 07 2 f 2 f 61 01 74 69 07 61 09 07 29 4 e 69 67 75 61 01 00 41 4 f 6 e 00 53 6 f 70 2 f
Структура class файла Так выглядит байт код нашей простой программы. Есть два вида байт кода. Собственно, сам байт код представленный на предыдущем слайде и его мнемоническое представление для виртуальной машины Java, которое будет показано позже. Рассмотрим байт код подробнее. u 4 magic Это 4 байта для magic, который определяет формат class файла (ca fe ba be). Позволяет идентифицировать. class файл. Всегда принимает значение: 0 x. CAFEBABE. u 2 minor_version ( 00 00 ) u 2 major_version ( 00 34 ) Вспомогательная и основная версии class файла. u 2 constant_pool_count ( 00 1 d ) Размер массива констант. Эти два байта представляют constant_pool_count и отвечают за размер constant_pool. Кафедра защищенных систем связи
Структура class файла cp_info constant_pool [constant_pool_count-1] Пул констант представлен в виде массива структур представляющих различные строковые константы - имена классов и интерфейсов, полей, методов и другие константы, на которые есть ссылки в файле класса. Далее в байт коде идут элементы вида: cp_info { u 1 tag; // 1 байт на тег u 1 info[]; // массив с описанием } Формат каждого элемента пула констант определяется первым байтом (tag). Кафедра защищенных систем связи
Структура class файла Constant Type Value CONSTANT_Class 7 CONSTANT_Long 5 CONSTANT_Methodref 10 CONSTANT_String 8 CONSTANT_Float 4 CONSTANT_Fieldref 9 CONSTANT_Utf 8 1 CONSTANT_Method. Type 16 Constant_Long_info { u 1 tag; u 4 high_bytes; u 4 low_bytes; } Constant_utf 8_info { u 1 tag; u 2 length; u 1 bytes[length]; } Кафедра защищенных систем связи
Структура class файла u 2 access_flags Флаг доступа, отображающий модификаторы, заданные в определении класса (public, final, abstract и т. д. ), а также признак класса или интерфейса. Значение элемента является маской флагов, используемых таким образом, чтобы обозначить права доступа и свойства этого класса. Flag Name Value ACC_PUBLIC 0 x 0001 ACC_FINAL 0 x 0010 ACC_SUPER 0 x 0020 ACC_INTERFACE 0 x 0200 ACC_ABSTRACT 0 x 0400 ACC_SYNTHETIC 0 x 1000 ACC_ANNOTATION 0 x 2000 ACC_ENUM 0 x 4000 Interpretation Объявлен открытым. Может быть доступен извне пакета. Объявлен final. Классы наследники не допускаются. Обращение к методам суперкласса. Когда вызывается инструкция invokespecial. Интерфейс. Не класс. Объявлен абстрактным. Не может иметь экземпляров. Объявлен synthetic; Не представлен в исходном коде. Объявлен как тип аннтоция. Объявлен в качестве типа перечисления. Кафедра защищенных систем связи
Структура class файла u 2 this_class u 2 super_class Ссылки на константу с названием класса и его суперкласса. u 2 interfaces_count Размер массива интерфейсов. u 2 interfaces[interfaces_count] Массив интерфейсов. Каждый элемент массива является индексом таблицы пула констант, где указывается имя интерфейса. Кафедра защищенных систем связи
Структура class файла field_info fields[fields_count] Массив полей. u 2 fields_count Размер массива полей. field_info{ u 2 access_flags; u 2 name_index; u 2 descriptor_index; u 2 attributes_count; attribute_info attributes [attributes_count]; } Кафедра защищенных систем связи
Структура class файла method_info methods[methods_count] Массив методов. u 2 methods_count Размер массива методов. method_info { u 2 access_flags; u 2 name_index; u 2 descriptor_index; u 2 attributes_count; attribute_info attributes[attributes_count]; } Кафедра защищенных систем связи
Структура class файла attribute_info attributes[attributes_count] Массив атрибутов. u 2 attributes_count Размер массива атрибутов. attribute_info { u 2 attribute_name_index; u 4 attribute_length; u 1 info [attribute_length]; } Нас интересует атрибут Code, так как именно в нем содержится необходимая нам информация. Если у вас нет исходных кодов программы, есть только class файл и вам необходимо внести некоторые изменения в работе программы, то начинать следует именно с этого атрибута. Кафедра защищенных систем связи
Структура class файла Список атрибутов (attribute) Constant. Value Line. Number. Table Code Local. Variabletable Stack. Map. Table Local. Variable. Type. Table Exceptions Deprecated Inner. Classes Runtime. Visible. Annotations Enclosing. Method Runtime. Invisible. Annotations Synthetic Runtaime. Visible. Parameter. Annotations Signature Runtaime. Invisible. Parameter. Annotations Source. File Annotation. Default Source. Debuf. Extension Bootstrap. Methods Кафедра защищенных систем связи
Структура class файла Code_attribute { u 2 attribute_name_index; u 4 attribute_length; u 2 max_stack; u 2 max_locals; u 4 code_length; u 1 code [code_length]; u 2 exception_table_length; { u 2 start_pc; u 2 end_pc; u 2 handler_pc; u 2 catch_type; } exception_table [exception_table_length]; u 2 attributes_count; attribute_info attributes [attributes_count]; } Кафедра защищенных систем связи
Средства работы с class файлами JBE - Java Bytecode Editor – программа, позволяющая просматривать и редактировать class файлы. javap – декомпилятор class файлов. javap команда дизассемблирует один или более файлов класса. Его вывод зависит от используемых опций. Если никакие опции не используются, javap распечатывает пакет, защищенные, и общедоступные поля и методы классов, которые передают к этому. javap печатает свой вывод к stdout. Кафедра защищенных систем связи
Средства работы с class файлами Некоторые опции javap: -? Распечатывает сообщение справки для javap. -p Показать все классы и элементы. -s Печатает внутренние подписи типа. -sysinfo -c Распечатывает дизассемблированный код, то есть, инструкции, которые включают Байт-коды Java для каждого из методов в классе. Они документируются в Спецификацию виртуальной машины Java. Кафедра защищенных систем связи
Средства работы с class файлами Файл Main. java public class Main { public static void main (String [] args ){ int a = 4; int b = 5; int c = a+b; } } Скомпилируем данный код с помощью команды javac Main. java Затем в командной строке или если в используемой вами IDE есть своя командная строка, то в ней выполним команду: javap -c Main. class Кафедра защищенных систем связи
Средства работы с class файлами Команда вывела на экран инструкции, которые включают Байт-коды Java для каждого из методов в классе. Кафедра защищенных систем связи
Средства работы с class файлами JBE - Java Bytecode Editor – программа, позволяющая просматривать и редактировать class файлы. Файл Main. java public class Main { public static void main (String [] args ){ int a = 4; int b = 5; int c = a+b; } } Скомпилируем данный код с помощью команды javac Main. java. Полученный class файл загрузим в Byte. Code Editor. Кафедра защищенных систем связи
Средства работы с class файлами Как видно на данном скриншоте, программа позволяет посмотреть пул констант Кафедра защищенных систем связи
Средства работы с class файлами А также, возможен просмотр списка инструкций, в атрибуте Code Результат идентичен выполнению команды javap -c Кафедра защищенных систем связи
Лекция 2.pptx