Joker 2016 - Bytecode 101
-
Upload
anton-arhipov -
Category
Technology
-
view
135 -
download
0
Transcript of Joker 2016 - Bytecode 101
![Page 1: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/1.jpg)
Байткод для любознательных
@antonarhipovJoker 2016, СПб
![Page 2: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/2.jpg)
@antonarhipov
Антон Архипов
![Page 3: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/3.jpg)
Зачем?
![Page 4: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/4.jpg)
Зачем?
• Знай свою платформу!
![Page 5: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/5.jpg)
Зачем?
• Знай свою платформу!
• Хотите написать свой компилятор?
![Page 6: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/6.jpg)
Зачем?
• Знай свою платформу!
• Хотите написать свой компилятор?
• Фреймворки (AOP, ORM)
![Page 7: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/7.jpg)
Зачем?
• Знай свою платформу!
• Хотите написать свой компилятор?
• Фреймворки (AOP, ORM)
• Всевозможные инструменты (см. JRebel)
![Page 8: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/8.jpg)
Зачем?
• Знай свою платформу!
• Хотите написать свой компилятор?
• Фреймворки (AOP, ORM)
• Всевозможные инструменты (см. JRebel)
• … ну или может просто скучно?
![Page 9: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/9.jpg)
Основы Java-байткода
Инструментарий
ObjectWeb ASM
![Page 10: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/10.jpg)
1 + 2
![Page 11: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/11.jpg)
1 + 2
1 2 +
![Page 12: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/12.jpg)
1 + 2
1 2 +
![Page 13: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/13.jpg)
1 + 2
1 2 + PUSH 1 1
![Page 14: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/14.jpg)
1 + 2
1 2 + PUSH 1 PUSH 2 2
1
![Page 15: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/15.jpg)
1 + 2
1 2 + PUSH 1 PUSH 2 ADD
3
![Page 16: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/16.jpg)
1 + 2
1 2 + ICONST_1 ICONST_2 IADD
3
![Page 17: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/17.jpg)
? = 1 + 2
![Page 18: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/18.jpg)
Таксономия
![Page 19: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/19.jpg)
Работа со стеком
Таксономия
![Page 20: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/20.jpg)
Работа со стеком
Инструкции управления
Таксономия
![Page 21: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/21.jpg)
Работа со стеком
Инструкции управления
Работа с объектами
Таксономия
![Page 22: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/22.jpg)
Работа со стеком
Инструкции управления
Арифметика Работа с объектами
Таксономия
![Page 23: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/23.jpg)
Работа со стеком
Инструкции управления
Арифметика Работа с объектами
monitorenter monitorexit
Таксономия
![Page 24: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/24.jpg)
Байт-код
![Page 26: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/26.jpg)
Байт-код
• Одно-байтные инструкции
• 256 возможных вариантов
![Page 27: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/27.jpg)
Байт-код
• Одно-байтные инструкции
• 256 возможных вариантов
• Используется 200+
![Page 28: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/28.jpg)
Байт-код
• Одно-байтные инструкции
• 256 возможных вариантов
• Используется 200+
• Google: “Java bytecode instructions listings”
![Page 29: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/29.jpg)
Байт-код
• Одно-байтные инструкции
• 256 возможных вариантов
• Используется 200+
• Google: “Java bytecode instructions listings”
• https://en.wikipedia.org/wiki/Java_bytecode_instruction_listings
![Page 30: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/30.jpg)
ОПЕРАЦИЯТИП
![Page 31: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/31.jpg)
• <тип> ::= b, s, c, i, l, f, d, a
ОПЕРАЦИЯТИП
![Page 32: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/32.jpg)
• <тип> ::= b, s, c, i, l, f, d, a• Константы (ldc, iconst_1)
ОПЕРАЦИЯТИП
![Page 33: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/33.jpg)
• <тип> ::= b, s, c, i, l, f, d, a• Константы (ldc, iconst_1)• Локальные переменные и стек (load/store)
ОПЕРАЦИЯТИП
![Page 34: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/34.jpg)
• <тип> ::= b, s, c, i, l, f, d, a• Константы (ldc, iconst_1)• Локальные переменные и стек (load/store)• Операции с массивами (aaload, aastore)
ОПЕРАЦИЯТИП
![Page 35: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/35.jpg)
• <тип> ::= b, s, c, i, l, f, d, a• Константы (ldc, iconst_1)• Локальные переменные и стек (load/store)• Операции с массивами (aaload, aastore)• Арифметика (add, sub, mul, div)
ОПЕРАЦИЯТИП
![Page 36: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/36.jpg)
• <тип> ::= b, s, c, i, l, f, d, a• Константы (ldc, iconst_1)• Локальные переменные и стек (load/store)• Операции с массивами (aaload, aastore)• Арифметика (add, sub, mul, div)• Булевые/битовые операции (iand, ixor)
ОПЕРАЦИЯТИП
![Page 37: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/37.jpg)
• <тип> ::= b, s, c, i, l, f, d, a• Константы (ldc, iconst_1)• Локальные переменные и стек (load/store)• Операции с массивами (aaload, aastore)• Арифметика (add, sub, mul, div)• Булевые/битовые операции (iand, ixor)• Сравнения (cmpg, cmpl, ifne, ifeq)
ОПЕРАЦИЯТИП
![Page 38: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/38.jpg)
• <тип> ::= b, s, c, i, l, f, d, a• Константы (ldc, iconst_1)• Локальные переменные и стек (load/store)• Операции с массивами (aaload, aastore)• Арифметика (add, sub, mul, div)• Булевые/битовые операции (iand, ixor)• Сравнения (cmpg, cmpl, ifne, ifeq)• Преобразования (l2d, i2l)
ОПЕРАЦИЯТИП
![Page 39: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/39.jpg)
![Page 40: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/40.jpg)
JVM процесс
![Page 41: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/41.jpg)
Thread 1
Thread 2
Thread 3
Thread 4
![Page 42: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/42.jpg)
![Page 43: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/43.jpg)
• JVM работает со стеком
• У каждого потока есть стек
• Стек сохраняет “фреймы”
• Новый “фрейм” создаётся при вызове метода
• “Фрейм” состоит из:
– Стек операций
– Массив локальных переменных
Стековая машина
![Page 44: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/44.jpg)
Стек операций
Локальные переменные
20 1 N…
Константы#1
![Page 45: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/45.jpg)
Работа со стеком и локальными переменными
![Page 46: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/46.jpg)
AB
dup pop swap dup_x1 dup2_x1
![Page 47: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/47.jpg)
A
B
dup pop swap dup_x1 dup2_x1
A
![Page 48: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/48.jpg)
dup pop swap dup_x1 dup2_x1
AB
![Page 49: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/49.jpg)
dup pop swap dup_x1 dup2_x1
AB
![Page 50: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/50.jpg)
dup pop swap dup_x1 dup2_x1
AB
B
![Page 51: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/51.jpg)
dup pop swap dup_x1 dup2_x1
AB
BBA
![Page 52: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/52.jpg)
ldc "Hello" astore_0 iconst_1 astore_1 aload_0
глубина значение
Стекпеременная значение
Локальные переменные
0
1
2
3
4
0
1
2
3
4
![Page 53: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/53.jpg)
ldc "Hello" astore_0 iconst_1 astore_1 aload_0
"Hello"0
1
2
3
4
0
1
2
3
4
глубина значениепеременная значение
СтекЛокальные переменные
![Page 54: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/54.jpg)
ldc "Hello" astore_0 iconst_1 astore_1 aload_0
"Hello"0
1
2
3
4
0
1
2
3
4
глубина значениепеременная значение
СтекЛокальные переменные
![Page 55: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/55.jpg)
ldc "Hello" astore_0 iconst_1 astore_1 aload_0
"Hello"0
1
2
3
4
0
1
2
3
4
1
глубина значениепеременная значение
СтекЛокальные переменные
![Page 56: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/56.jpg)
ldc "Hello" astore_0 iconst_1 astore_1 aload_0
"Hello"0
1
2
3
4
0
1
2
3
4
1
глубина значениепеременная значение
СтекЛокальные переменные
![Page 57: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/57.jpg)
ldc "Hello" astore_0 iconst_1 astore_1 aload_0
"Hello"0
1
2
3
4
0
1
2
3
4
1
"Hello"
глубина значениепеременная значение
СтекЛокальные переменные
![Page 58: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/58.jpg)
СтекТаблица
локальных переменных
store
load
![Page 59: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/59.jpg)
Вызовы методов
![Page 60: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/60.jpg)
invokeXXX
• invokestatic • invokespecial
• invokevirtual • invokeinterface • invokedynamic
![Page 61: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/61.jpg)
invokestatic
• invokestatic • invokespecial
• invokevirtual • invokeinterface • invokedynamic
Integer.valueOf(“42”)
![Page 62: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/62.jpg)
invokespecial
• invokestatic • invokespecial
• invokevirtual • invokeinterface • invokedynamic
<init>
private void foo();
super.method();
![Page 63: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/63.jpg)
• invokestatic • invokespecial
• invokevirtual • invokeinterface • invokedynamic
invokevirtual
class A
class B
A/method1 A/method2
A/method1 B/method2 B/method3
![Page 64: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/64.jpg)
invokeinterface
• invokestatic • invokespecial
• invokevirtual • invokeinterface • invokedynamic
Efficient Implementation of Java Interfaces: Invokeinterface Considered Harmless, Bowen Alpern, Anthony Cocchi, Stephen Fink, David Grove, and Derek Lieber, OOPSLA’01
class A
class B impl X
A/method1 A/method2
A/method1 B/method2 B/method3 X/methodX
D impl XD/method1 X/methodX
![Page 65: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/65.jpg)
Вызов метода
![Page 66: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/66.jpg)
obj.method(param1, param2);
Вызов метода
![Page 67: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/67.jpg)
obj.method(param1, param2);
Вызов метода
![Page 68: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/68.jpg)
obj.method(param1, param2);
push obj push param1 push param2 call method
Вызов метода
![Page 69: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/69.jpg)
obj.method(param1, param2);
push obj push param1 push param2 call method
obj
Вызов метода
![Page 70: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/70.jpg)
obj.method(param1, param2);
push obj push param1 push param2 call method
objparam1
Вызов метода
![Page 71: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/71.jpg)
obj.method(param1, param2);
push obj push param1 push param2 call method
objparam1param2
Вызов метода
![Page 72: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/72.jpg)
obj.method(param1, param2);
push obj push param1 push param2 call method
obj?
Вызов метода
![Page 73: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/73.jpg)
this.add(1, 2);0: aload_0 1: iconst_1 2: iconst_2 3: invokevirtual #2; //Method add:(II)I
Вызов метода
![Page 74: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/74.jpg)
Стек
pop push
![Page 75: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/75.jpg)
СтекТаблица
локальных переменных
store
load
pop push
![Page 76: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/76.jpg)
СтекТаблица
локальных переменных
store
load
pop push
![Page 77: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/77.jpg)
СтекТаблица
локальных переменных
store
load
pop push
СтекТаблица
локальных переменных
store
load
pop push
invoke
![Page 78: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/78.jpg)
![Page 79: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/79.jpg)
public class Hello { public static void main(String[] args) { System.out.println("Hello, World!"); }}
![Page 80: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/80.jpg)
public class Hello { public static void main(String[] args) { System.out.println("Hello, World!"); }}> javap -c Hello
Дезассемблировать Hello
![Page 81: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/81.jpg)
public class Hello { public static void main(String[] args) { System.out.println("Hello, World!"); }}> javap -c Hello
javap
• Дизассемблер Java класс-файлов
• По-умолчанию показывает только структуру класса
– Методы, супер-класс, интерфейсы, итд
• -c покажет байткод методов
• -private покажет все приватные поля и методы
• -s покажет сигнатуры
• -l покажет номера строк и таблицу локальных переменных
![Page 82: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/82.jpg)
public class Hello { public static void main(String[] args) { System.out.println("Hello, World!"); }}> javap -c Hello Compiled from "Hello.java" public class Hello extends java.lang.Object{ public Hello(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return
![Page 83: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/83.jpg)
> javap -c Hello Compiled from "Hello.java" public class Hello extends java.lang.Object{ public Hello(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return
Конструктор по-умолчанию
public class Hello { public static void main(String[] args) { System.out.println("Hello, World!"); }}
![Page 84: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/84.jpg)
> javap -c Hello Compiled from "Hello.java" public class Hello extends java.lang.Object{ public Hello(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return
Выложить this на стек
public class Hello { public static void main(String[] args) { System.out.println("Hello, World!"); }}
![Page 85: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/85.jpg)
> javap -c Hello Compiled from "Hello.java" public class Hello extends java.lang.Object{ public Hello(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return
Вызвать <init> для Object
public class Hello { public static void main(String[] args) { System.out.println("Hello, World!"); }}
![Page 86: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/86.jpg)
public class Hello { public static void main(String[] args) { System.out.println("Hello, World!"); }}> javap -c Hello Compiled from "Hello.java" public class Hello extends java.lang.Object{ public Hello(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return
![Page 87: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/87.jpg)
public class Hello { public static void main(String[] args) { System.out.println("Hello, World!"); }}> javap -c Hello Compiled from "Hello.java" public class Hello extends java.lang.Object{ public Hello(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return
public static void main(java.lang.String[]); Code: 0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #3; //String Hello, World! 5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
![Page 88: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/88.jpg)
> javap -c Hello Compiled from "Hello.java" public class Hello extends java.lang.Object{ public Hello(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return
public static void main(java.lang.String[]); Code: 0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #3; //String Hello, World! 5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
Обратиться к статическому полю
public class Hello { public static void main(String[] args) { System.out.println("Hello, World!"); }}
![Page 89: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/89.jpg)
> javap -c Hello Compiled from "Hello.java" public class Hello extends java.lang.Object{ public Hello(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return
public static void main(java.lang.String[]); Code: 0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #3; //String Hello, World! 5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
Загрузить строковую константу в стек
public class Hello { public static void main(String[] args) { System.out.println("Hello, World!"); }}
![Page 90: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/90.jpg)
> javap -c Hello Compiled from "Hello.java" public class Hello extends java.lang.Object{ public Hello(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return
public static void main(java.lang.String[]); Code: 0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #3; //String Hello, World! 5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
Вызвать метод с параметром
public class Hello { public static void main(String[] args) { System.out.println("Hello, World!"); }}
![Page 91: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/91.jpg)
public class Hello { public static void main(String[] args) { System.out.println("Hello, World!"); }}> javap -c Hello Compiled from "Hello.java" public class Hello extends java.lang.Object{ public Hello(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return
public static void main(java.lang.String[]); Code: 0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #3; //String Hello, World! 5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
![Page 92: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/92.jpg)
> javap -c Hello Compiled from "Hello.java" public class Hello extends java.lang.Object{ public Hello(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return
public static void main(java.lang.String[]); Code: 0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #3; //String Hello, World! 5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
Что такое #1,#2, итд ?
public class Hello { public static void main(String[] args) { System.out.println("Hello, World!"); }}
![Page 93: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/93.jpg)
public class Hello { public static void main(String[] args) { System.out.println("Hello, World!"); }}> javap -c -verbose Hello
![Page 94: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/94.jpg)
public class Hello { public static void main(String[] args) { System.out.println("Hello, World!"); }}> javap -c -verbose Hello Compiled from "Hello.java“ public class Hello extends java.lang.Object SourceFile: "Hello.java" minor version: 0 major version: 50 Constant pool: const #1 = Method #6.#20; // java/lang/Object."<init>":()V const #2 = Field #21.#22; // java/lang/System.out:Ljava/io/PrintStream; const #3 = String #23; // Hello, World! const #4 = Method #24.#25; // java/io/PrintStream.println:(Ljava/lang/String;)V const #5 = class #26; // Hello const #6 = class #27; // java/lang/Object const #7 = Asciz <init>;
![Page 95: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/95.jpg)
public class Hello { public static void main(String[] args) { System.out.println("Hello, World!"); }}> javap -c -verbose Hello Compiled from "Hello.java“ public class Hello extends java.lang.Object SourceFile: "Hello.java" minor version: 0 major version: 50 Constant pool: const #1 = Method #6.#20; // java/lang/Object."<init>":()V const #2 = Field #21.#22; // java/lang/System.out:Ljava/io/PrintStream; const #3 = String #23; // Hello, World! const #4 = Method #24.#25; // java/io/PrintStream.println:(Ljava/lang/String;)V const #5 = class #26; // Hello const #6 = class #27; // java/lang/Object const #7 = Asciz <init>;
![Page 96: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/96.jpg)
public class Hello { public static void main(String[] args) { System.out.println("Hello, World!"); }}> javap -c -verbose Hello public class Hello extends java.lang.Object … public Hello(); Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return LineNumberTable: line 1: 0 LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LHello;
![Page 97: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/97.jpg)
public class Hello { public static void main(String[] args) { System.out.println("Hello, World!"); }}> javap -c -verbose Hello public class Hello extends java.lang.Object … public Hello(); Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return LineNumberTable: line 1: 0 LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LHello;
![Page 98: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/98.jpg)
public class Hello { public static void main(String[] args) { System.out.println("Hello, World!"); }}> javap -c -verbose Hello public class Hello extends java.lang.Object … public Hello(); Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return LineNumberTable: line 1: 0 LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LHello;
![Page 99: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/99.jpg)
public class Hello { public static void main(String[] args) { System.out.println("Hello, World!"); }}> javap -c -verbose Hello public class Hello extends java.lang.Object … public Hello(); Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return LineNumberTable: line 1: 0 LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LHello;
![Page 100: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/100.jpg)
![Page 102: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/102.jpg)
IntelliJ IDEA: ASM Bytecode Outline plugin
![Page 103: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/103.jpg)
public java.lang.String getName(); Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: getfield #2; //Field name:Ljava/lang/String; 4: areturn LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LGet;
public class Get { String name; public String getName() { return name; }}
![Page 104: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/104.jpg)
aload_0 getfield 00 02 areturn
0 1 2 3 4
public java.lang.String getName(); Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: getfield #2; //Field name:Ljava/lang/String; 4: areturn LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LGet;
![Page 105: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/105.jpg)
2A B4
public java.lang.String getName(); Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: getfield #2; //Field name:Ljava/lang/String; 4: areturn LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LGet;
00 02
0 1 2 3 4
B0
![Page 106: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/106.jpg)
public java.lang.String getName(); Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: getfield #2; //Field name:Ljava/lang/String; 4: areturn LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LGet;
![Page 107: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/107.jpg)
![Page 108: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/108.jpg)
ObjectWeb ASM
• Низкоуровневый фреймворк для манипуляций и анализа Java-байткода
• Стандарт de facto
• http://asm.ow2.org
![Page 109: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/109.jpg)
![Page 110: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/110.jpg)
Зачем манипулировать байткодом (ещё раз)
• Профилировщики
• Агенты для мониторинга
• Дебаггеры
• Фреймворки
• JRebel
![Page 111: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/111.jpg)
Зачем манипулировать байткодом (ещё раз)
• Профилировщики
• Агенты для мониторинга
• Дебаггеры
• Фреймворки
• JRebel
Требуется внедрение функциональности в работающий код
![Page 112: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/112.jpg)
ASM: общий сценарий
Создать ClassWriter
Скомпановать visitor-ы:
аннотации, поля, методы, итд
Генерировать новый байткод
12
3
![Page 113: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/113.jpg)
Class Reader
Class Visitor
![Page 114: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/114.jpg)
Class Writer
Class Visitor
Class Visitor
Class Reader
![Page 115: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/115.jpg)
Class Writer
Class Visitor
Class Visitor
Class Reader
Class Visitor
Class Visitor
![Page 116: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/116.jpg)
Class Writer
Class Visitor
Class Visitor
Class Reader
Class Visitor
Class Visitor
Class Visitor
Class Visitor
Class Visitor
Class Visitor
Class Visitor
Class Reader
Class Writer
![Page 117: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/117.jpg)
ClassVisitor
visitvisitSource
visitOuterClassvisitAnnotationvisitAttributevisitInnerClass
visitFieldvisitMethod
visitEnd
ClassReader
![Page 118: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/118.jpg)
ClassVisitor
visitvisitSource
visitOuterClassvisitAnnotation
visitAttributevisitInnerClass
visitFieldvisitMethod
visitEnd
AnnotationVisitor
FieldVisitorMethodVisitor
ClassReader
![Page 119: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/119.jpg)
![Page 121: Joker 2016 - Bytecode 101](https://reader030.fdocuments.co/reader030/viewer/2022021506/587c17b71a28abb5068b49a1/html5/thumbnails/121.jpg)