SlideShare une entreprise Scribd logo
1  sur  35
Основы байт-кода Java
План

Что такое байт-код?
Основные понятия
Соответствие между Java и байт-кодом
Библиотека ASM
JDK 5-7
Байт-код

Промежуточное
представление между Java и
машинным кодом
Исходный код переводится в
байт-код максимально
близко либо выражается его
средствами
Большинство ограничений
Java распространяются на
байт-код.


                         Source: http://viralpatel.net/blogs/java-virtual-machine-an-inside-story/
Что можно делать с байт-кодом?

Читать
– javap
– Анализ классов
– Анализ и модификация стороннего кода
Создавать
– Генерация классов на лету
– Компиляция
Изменять
– AOP
– Инструментация
– Профилирование
Понимать
– Франкенбилды
Почему он нужен редко?

Декомпиляторы
– Jad
Существующие средства AOP
– AspectJ
java.lang.reflect.Proxy
Средства для работы с байт-кодом

ASM
CGLIB
BCEL
SERP
Javassist
Jasmin
Jamaica
План

Что такое байт-код?
Основные понятия
Соответствие между Java и байт-кодом
Библиотека ASM
JDK 5-7
Структура класса

Все компилируется в .class
– Классы
– Интерфейсы
    • <clinit>
– Аннотации
    • java.lang.annotation.Annotation
– Перечисления
    • java.lang.Enum




                             Source: http://viralpatel.net/blogs/tutorial-java-class-file-format-revealed/
Стек и регистры

Регистры используются для локальных переменных
Операции производятся со стеком, например:
– public float sum(int a, int b) { return a + b; } становится
    •   iload_1 // положить в стек значение параметра a
    •   iload_2 // положить в стек значение параметра b
    •   Iadd // сложить два верхних элемента стека, результат в стек
    •   I2f // сконвертировать верхний элемент стека из int в float
    •   freturn // вернуть верхний элемент стека
В стеке и регистрах хранятся 32-битные значения
long и double занимают две ячейки
Сигнатуры

Z = boolean, C, B, S, I, J = long, F, D
Массив: [[Z = boolean[][]
Объект: Ljava/lang/Integer; = java.lang.Integer
Метод: (II)V = void(int, int)
Пример использования:
– private Object x = new StringBuffer(); становится
    •   aload_0
    •   invokespecial java/lang/Object."<init>":()V
    •   aload_0
    •   new java/lang/StringBuffer
    •   dup
    •   invokespecial java/lang/StringBuffer."<init>":()V
    •   putfield x:Ljava/lang/Object;
    •   return
Опкоды

Соглашения
– Приставки
    • b, c, s, i, l, f, d
    • a = reference
– iload_0 = iload 0
Работа со стеком
– Занесение значения регистра в стек
    • aload, dload, fload, iload, lload
– Перенос верхнего значения из стека в регистр
    • astore, dstore, fstore, istore, lstore
– Запись константы в стек
    • aconst_null, dconst_{0,1}, fconst_{0,1,2}, iconst_{m1,0,1,2,3,4,5}, lco
      nst_{0,1}, ldc, ldc2, bipush, sipush
– Изменение вершины стека
    • pop, pop2, dup, dup2, dup2_x1, dup2_x2, dup_x1, dup_x2, swap
Опкоды

Арифметические операции
– dadd, ddiv, dmul, dneg, drem, dsub, fadd, fdiv, fmul, fneg, frem, fs
  ub, iadd, idiv, iinc, imul, ineg, irem, isub, ladd, ldiv, lmul, lneg, lre
  m, lsub
Логические операции и операции сдвига
– iand, ior, ishl, ishr, iushr, ixor, land, lor, lshl, lshr, lushr, lxor
Приведение типа
– d2f, d2i, d2l, f2d, f2i, f2l, i2b, i2c, i2d, i2f, i2l, i2s, l2d, l2f, l2i
Безусловный переход
– goto, jsr, ret
Условный переход
– if_acmpeq, if_acmpne, if_icmpeq, if_icmpge, if_icmpgt, if_icmple,
  if_icmplt, if_icmpne, ifeq, ifge, ifgt, ifle, iflt, ifne, ifnonnull, ifnull
Опкоды

Проверка условий
– dcmpg, dcmpl, fcmpg, fcmpl, lcmp, instanceof
Работа с массивами
– Создание и получение размера
    • anewarray, arraylength, multianewarray, newarray
– Установка значения элемента
    • aastore, bastore, castore, dastore, fastore, iastore, lastore, sastore
– Получение значения элемента
    • aaload, baload, caload, daload, faload, iaload, laload, saload
Возврат значения и выбрасывание исключений
– areturn, dreturn, freturn, ireturn, lreturn, return, athrow
Опкоды

Синхронизация
– monitorenter, monitorexit
Создание объекта
– new
Многовариантный выбор
– lookupswitch, tableswitch
Проверка типа
– checkcast
Пустой оператор
– nop
Префикс 16-битных аргументов
– wide
Методы и поля

Опкоды для вызова методов:
–   invokedynamic
–   invokeinterface
–   invokespecial
–   invokestatic
–   Invokevirtual
Чтение и запись значений полей
– getfield, getstatic, putfield, putstatic
Сигнатуры

Всякое обращение к методу или полю содержит сигнатуру
Никакого встраивания
– Кроме static final полей с инициализатором
    •   public static int SIZE = 5;
    •   public static Object x = new Object();
    •   public static String NAME = “name”;
    •   public static String NAME; static {NAME = “name”;}
    •   interface IA { public String x = new Object().toString(); }
Метод или поле выбирается по имени и сигнатуре
Специальные методы <init> и <clinit>
Отладочная информация и исключения

 Code:                                                 public void myMethod() {
  0: iconst_0
  1: istore_1
                                                         try {
  2: goto 10                                                int x = 0;
  5: astore_1                                            } catch (ArithmeticException e) {
  6: aload_1                                                e.printStackTrace();
  7: invokevirtual #23; //Method
java/lang/ArithmeticException.printStackTrace:()V        }
  10: return                                           }
  Exception table:
  from to target type
    0 2 5 Class java/lang/ArithmeticException

LineNumberTable:
 line 32: 0
 line 33: 5
 line 34: 6
 line 36: 10

 LocalVariableTable:
 Start Length Slot Name Signature
 0    11    0 this      LMySample;
 2    3    1 x       I
 6    4    1 e       Ljava/lang/ArithmeticException;
Верификация

Проверка типов
Нет переполнения или опустошения стека
Нельзя перейти по неправильному адресу
Значение записывается в регистр перед чтением из него
Объект инициализируется перед его использованием
Вызовы методов и доступ к полям допустимы
План

Что такое байт-код?
Основные понятия
Соответствие между Java и байт-кодом
Библиотека ASM
JDK 5-7
Классы

     Все становится классом
     Внутренние классы, анонимные классы:
class MyOuterClass$MyInnerClass {                    private class MyInnerClass {
  private int y;                                       private int y;
  private MyOuterClass this$0;                         public MyInnerClass(int y) {
  public MyInnerClass(int y, MyOuterClass $parent)       this.y = y;
{                                                      }
    this.y = y;                                      }
    this.this$0 = $parent;
  }                                                  return new
  static /*synthetic*/ int                           MyInnerClass(5).y;
access$0(MyOuterClass$MyInnerClass c) }
    return c.y;
  }
}

return MyOuterClass$MyInnerClass.access$0(new
MyOuterClass$MyInnerClass(5, this));
Инициализация

Инициализация полей переносится в конструктор /
статические конструктор, кроме примитивных и строковых
констант
private byte[] myArray = {1,2,3,4,5}
–   byte[] x = new byte[5];
–   x[0] = 1
–   … x[4] = 5
–   this.myArray = x;
У интерфейса может быть метод <clinit>, содержащий код
Средства Java в байт-коде

String s = x + “ “ + y;
 – String s = new StringBuilder().append(x).append(“
   “).append(y).toString();
Циклы можно записать при помощи условного перехода
Тернарый оператор записывается через if-else
synchronized(x) {…}
 –   Object $lock = x;
 –   monitorenter($lock);
 –   try {
 –     …; monitorexit($lock);
 –   } catch (Throwable t) {
 –     monitorexit($lock);
 –     throw t;
 –   }
План

Что такое байт-код?
Основные понятия
Соответствие между Java и байт-кодом
Библиотека ASM
JDK 5-7
ASM

Чтение и создание классов
Visitors
Tree
Analysis
XML
ASM visitors

ClassWriter cw = new ClassWriter(false);
cw.visit( ACC_PUBLIC+ACC_ABSTRACT+ACC_INTERFACE,
  "asm1/Notifier", // class name
  "java/lang/Object", // super class
  null,          // interfaces
  "Notifier.java"); // source file

cv = cw.visitMethod( ACC_PUBLIC+ACC_ABSTRACT,
  "addListener",        // method name
  "(Lasm1/Listener;)V", // method descriptor
  null,            // exceptions
  null);           // method attributes

cw.visitEnd();

byte[] bytecode = cw.toByteArray();




                                      Source: http://onjava.com/pub/a/onjava/2004/10/06/asm1.html
ASM visitors

mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
mv.visitInsn(RETURN);
mv.visitMaxs(1, 1);
mv.visitEnd();




                          Source: http://www.ibm.com/developerworks/java/library/j-cwt05125/index.html
ASM tree

ClassNode classNode=new ClassNode(4);//4 is just the API version number
classNode.version=Opcodes.V1_6;
classNode.access=Opcodes.ACC_PUBLIC;
classNode.signature="Lcom/geekyarticles/asm/Generated;";
classNode.name="com/geekyarticles/asm/Generated";
classNode.superName="java/lang/Object";
MethodNode mainMethod=new
MethodNode(4,Opcodes.ACC_PUBLIC|Opcodes.ACC_STATIC,"main",
          "([Ljava/lang/String;)V",null, null);
mainMethod.instructions.add(new FieldInsnNode(Opcodes.GETSTATIC, "java/lang/System",
          "out", "Ljava/io/PrintStream;"));
mainMethod.instructions.add(new LdcInsnNode("Hello World!"));
mainMethod.instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL,
          "java/io/PrintStream", "println", "(Ljava/lang/String;)V"));
mainMethod.instructions.add(new InsnNode(Opcodes.RETURN));
classNode.methods.add(mainMethod);                                     public class com.geekyarticles.asm.Generated {
                                                                         public static void main(String args[]) {
ClassWriter cw=new ClassWriter(ClassWriter.COMPUTE_MAXS|                   System.out.println(“Hello World!”);
          ClassWriter.COMPUTE_FRAMES);                                   }
                                                                       }
classNode.accept(cw);


                   Source: http://www.javacodegeeks.com/2012/02/manipulating-java-class-files-with-asm_22.html
План

Что такое байт-код?
Основные понятия
Соответствие между Java и байт-кодом
Библиотека ASM
JDK 5-7
foreach loop

for (Type t : i)

aload_1                                                aload_1
dup                                                    invokeinterface java/util/Collection.iterator:()Ljava/util/Iterator;
astore 5                                               astore_3
arraylength                                            goto 27
istore 4                                               aload_3
iconst_0                                               invokeinterface java/util/Iterator.next:()Ljava/lang/Object;
istore_3                                               checkcast class java/lang/String
goto 27                                                astore_2
aload5                                                 getstatic java/lang/System.out:Ljava/io/PrintStream;
iload_3                                                aload_2
iaload                                                 invokevirtual java/io/PrintStream.println:(Ljava/lang/String;)V
istore_2                                               aload_3
getstatic java/lang/System.out:Ljava/io/PrintStream;   invokeinterface java/util/Iterator.hasNext:()Z
iload_2                                                ifne 10
invokevirtual java/io/PrintStream.println:(I)V         return
iinc 3, 1
iload_3
iload4
if_icmplt 12
return
Enum

  Enums
   – создается потомок java.lang.Enum

Compiled from "MyEnum.java"
public final class MyEnum extends java.lang.Enum{
  public static final MyEnum A;
  public static final MyEnum B;
  public static final MyEnum C;
  public static final MyEnum D;
  private static final MyEnum[] ENUM$VALUES;
  static {};
  private MyEnum(java.lang.String, int);
  public static MyEnum[] values();
  public static MyEnum valueOf(java.lang.String);
}
Изменения в JDK 5

    Varargs
    – void myMethod(long a, int… b) -> void myMethod(long a, int[] b)
    Autoboxing
    – Добавляются вызовы методов
    Annotations
    – создается потомок java.lang.annotation.Annotation
    – Аннотации добавлены в формат .class
    – LOCAL_VARIABLE target

Compiled from "MyAnnotation.java"
public interface MyAnnotation extends java.lang.annotation.Annotation{
public abstract java.lang.String name();

public abstract int count();

}
Generics

public class GenericsTest<T, Z extends List<T>> {
  public int myTest(Z z) {
     return z.size();
  }
}

public int myTest(java.util.List);
  Code:
  0: aload_1
  1: invokeinterface #20, 1; //InterfaceMethod java/util/List.size:()I
  6: ireturn
}
Generics

public final class GenericsTest2<T, Z extends ArrayList<T>> extends
GenericsTest<T, Z> {
  public int myTest(Z z) {
     return z.size() + 1;
  }
}

public int myTest(java.util.ArrayList);
 Code:
  0: aload_1
  1: invokevirtual #20; //Method java/util/ArrayList.size:()I
  4: iconst_1
  5: iadd
  6: ireturn

public int myTest(java.util.List);
  Code:
  0: aload_0
  1: aload_1
  2: checkcast       #21; //class java/util/ArrayList
  5: invokevirtual #30; //Method myTest:(Ljava/util/ArrayList;)I
  8: ireturn
}
JDK 7

invokedynamic
– Аналог invokestatic, но сигнатура не содежит имени класса /
  интерфейса
Thank you for your attention!

Contenu connexe

Tendances

Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиvictor-yastrebov
 
Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3Technopark
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыcorehard_by
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Dima Dzuba
 
PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокPVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокAndrey Karpov
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5Technopark
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4 Dima Dzuba
 
Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Yauheni Akhotnikau
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о BoostSergey Platonov
 
Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.Dima Dzuba
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковSergey Platonov
 
Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8. Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8. Dima Dzuba
 
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Sergey Platonov
 
Java осень 2014 занятие 6
Java осень 2014 занятие 6Java осень 2014 занятие 6
Java осень 2014 занятие 6Technopark
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
 
Legacy: как победить в гонке (Joker)
Legacy: как победить в гонке (Joker)Legacy: как победить в гонке (Joker)
Legacy: как победить в гонке (Joker)Victor_Cr
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Sergey Platonov
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Sergey Platonov
 
C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.Igor Shkulipa
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода Pavel Tsukanov
 

Tendances (20)

Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
 
Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
 
PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокPVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибок
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
 
Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о Boost
 
Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
 
Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8. Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8.
 
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
 
Java осень 2014 занятие 6
Java осень 2014 занятие 6Java осень 2014 занятие 6
Java осень 2014 занятие 6
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
Legacy: как победить в гонке (Joker)
Legacy: как победить в гонке (Joker)Legacy: как победить в гонке (Joker)
Legacy: как победить в гонке (Joker)
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
 
C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 

En vedette

Использование Qualcomm Augmented Reality в приложениях для Android
Использование Qualcomm Augmented Reality в приложениях для AndroidИспользование Qualcomm Augmented Reality в приложениях для Android
Использование Qualcomm Augmented Reality в приложениях для AndroidAlex Tumanoff
 
Object-2-Object mapping, как приправа к вашему проекту
Object-2-Object mapping, как приправа к вашему проектуObject-2-Object mapping, как приправа к вашему проекту
Object-2-Object mapping, как приправа к вашему проектуAlex Tumanoff
 
Async clinic by by Sergey Teplyakov
Async clinic by by Sergey TeplyakovAsync clinic by by Sergey Teplyakov
Async clinic by by Sergey TeplyakovAlex Tumanoff
 
Java 8 in action.jinq.v.1.3
Java 8 in action.jinq.v.1.3Java 8 in action.jinq.v.1.3
Java 8 in action.jinq.v.1.3Alex Tumanoff
 
Sergey Gavruk - WebMatrix
Sergey Gavruk - WebMatrixSergey Gavruk - WebMatrix
Sergey Gavruk - WebMatrixbeloslab
 
Enterprise or not to enterprise
Enterprise or not to enterpriseEnterprise or not to enterprise
Enterprise or not to enterpriseAlex Tumanoff
 
ASP.NET MVC 3 Anton Vidishchev
ASP.NET MVC 3 Anton VidishchevASP.NET MVC 3 Anton Vidishchev
ASP.NET MVC 3 Anton VidishchevAlex Tumanoff
 
презентация. академическая инициатива Ibm. rus (1)
презентация. академическая инициатива Ibm. rus (1)презентация. академическая инициатива Ibm. rus (1)
презентация. академическая инициатива Ibm. rus (1)Юлия Ставенко
 
Beginning mef by Владимир Лисник
Beginning mef by Владимир ЛисникBeginning mef by Владимир Лисник
Beginning mef by Владимир ЛисникAlex Tumanoff
 
LightSwitch - different way to create business applications
LightSwitch - different way to create business applicationsLightSwitch - different way to create business applications
LightSwitch - different way to create business applicationsAlex Tumanoff
 
Microsoft Test Manager 2010 by Anton Vidishchev
Microsoft Test Manager 2010 by  Anton VidishchevMicrosoft Test Manager 2010 by  Anton Vidishchev
Microsoft Test Manager 2010 by Anton VidishchevAlex Tumanoff
 

En vedette (15)

HTML 5
HTML 5HTML 5
HTML 5
 
Использование Qualcomm Augmented Reality в приложениях для Android
Использование Qualcomm Augmented Reality в приложениях для AndroidИспользование Qualcomm Augmented Reality в приложениях для Android
Использование Qualcomm Augmented Reality в приложениях для Android
 
Object-2-Object mapping, как приправа к вашему проекту
Object-2-Object mapping, как приправа к вашему проектуObject-2-Object mapping, как приправа к вашему проекту
Object-2-Object mapping, как приправа к вашему проекту
 
Async clinic by by Sergey Teplyakov
Async clinic by by Sergey TeplyakovAsync clinic by by Sergey Teplyakov
Async clinic by by Sergey Teplyakov
 
Spring.new hope.1.3
Spring.new hope.1.3Spring.new hope.1.3
Spring.new hope.1.3
 
Java 8 in action.jinq.v.1.3
Java 8 in action.jinq.v.1.3Java 8 in action.jinq.v.1.3
Java 8 in action.jinq.v.1.3
 
Sergey Gavruk - WebMatrix
Sergey Gavruk - WebMatrixSergey Gavruk - WebMatrix
Sergey Gavruk - WebMatrix
 
Enterprise or not to enterprise
Enterprise or not to enterpriseEnterprise or not to enterprise
Enterprise or not to enterprise
 
ASP.NET MVC 3 Anton Vidishchev
ASP.NET MVC 3 Anton VidishchevASP.NET MVC 3 Anton Vidishchev
ASP.NET MVC 3 Anton Vidishchev
 
Java Performance
Java PerformanceJava Performance
Java Performance
 
презентация. академическая инициатива Ibm. rus (1)
презентация. академическая инициатива Ibm. rus (1)презентация. академическая инициатива Ibm. rus (1)
презентация. академическая инициатива Ibm. rus (1)
 
Beginning mef by Владимир Лисник
Beginning mef by Владимир ЛисникBeginning mef by Владимир Лисник
Beginning mef by Владимир Лисник
 
LightSwitch - different way to create business applications
LightSwitch - different way to create business applicationsLightSwitch - different way to create business applications
LightSwitch - different way to create business applications
 
Microsoft Test Manager 2010 by Anton Vidishchev
Microsoft Test Manager 2010 by  Anton VidishchevMicrosoft Test Manager 2010 by  Anton Vidishchev
Microsoft Test Manager 2010 by Anton Vidishchev
 
JSF2
JSF2JSF2
JSF2
 

Similaire à Bytecode

Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage CollectorOlexandra Dmytrenko
 
Android - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsAndroid - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsNoveo
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Andrey Karpov
 
Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET Nikita Lipsky
 
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...Mail.ru Group
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9Technopark
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?Vasil Remeniuk
 
[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)Evgeny Kaziak
 
PHP Tricks
PHP TricksPHP Tricks
PHP TricksBlackFan
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioAndrey Karpov
 
Вещи в Java, о которых вы (возможно) не знали
Вещи в Java, о которых вы (возможно) не зналиВещи в Java, о которых вы (возможно) не знали
Вещи в Java, о которых вы (возможно) не зналиZheka Kozlov
 
Convert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at VizorConvert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at VizorDevGAMM Conference
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013ScalaNsk
 
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиZestranec
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному кодуVasiliy Deynega
 
Java весна 2013 лекция 9
Java весна 2013 лекция 9Java весна 2013 лекция 9
Java весна 2013 лекция 9Technopark
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кодаAndrey Karpov
 

Similaire à Bytecode (20)

Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage Collector
 
Android - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsAndroid - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, generics
 
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 
Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET
 
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
 
course js day 2
course js day 2course js day 2
course js day 2
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)
 
PHP Tricks
PHP TricksPHP Tricks
PHP Tricks
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
Вещи в Java, о которых вы (возможно) не знали
Вещи в Java, о которых вы (возможно) не зналиВещи в Java, о которых вы (возможно) не знали
Вещи в Java, о которых вы (возможно) не знали
 
Convert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at VizorConvert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at Vizor
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013
 
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасности
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному коду
 
Java весна 2013 лекция 9
Java весна 2013 лекция 9Java весна 2013 лекция 9
Java весна 2013 лекция 9
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 

Plus de Alex Tumanoff

Sql server 2019 New Features by Yevhen Nedaskivskyi
Sql server 2019 New Features by Yevhen NedaskivskyiSql server 2019 New Features by Yevhen Nedaskivskyi
Sql server 2019 New Features by Yevhen NedaskivskyiAlex Tumanoff
 
Odessa .net-user-group-sql-server-2019-hidden-gems by Denis Reznik
Odessa .net-user-group-sql-server-2019-hidden-gems by Denis ReznikOdessa .net-user-group-sql-server-2019-hidden-gems by Denis Reznik
Odessa .net-user-group-sql-server-2019-hidden-gems by Denis ReznikAlex Tumanoff
 
Azure data bricks by Eugene Polonichko
Azure data bricks by Eugene PolonichkoAzure data bricks by Eugene Polonichko
Azure data bricks by Eugene PolonichkoAlex Tumanoff
 
Sdlc by Anatoliy Anthony Cox
Sdlc by  Anatoliy Anthony CoxSdlc by  Anatoliy Anthony Cox
Sdlc by Anatoliy Anthony CoxAlex Tumanoff
 
Kostenko ux november-2014_1
Kostenko ux november-2014_1Kostenko ux november-2014_1
Kostenko ux november-2014_1Alex Tumanoff
 
"Drools: декларативная бизнес-логика в Java-приложениях" by Дмитрий Контрерас...
"Drools: декларативная бизнес-логика в Java-приложениях" by Дмитрий Контрерас..."Drools: декларативная бизнес-логика в Java-приложениях" by Дмитрий Контрерас...
"Drools: декларативная бизнес-логика в Java-приложениях" by Дмитрий Контрерас...Alex Tumanoff
 
Sql saturday azure storage by Anton Vidishchev
Sql saturday azure storage by Anton VidishchevSql saturday azure storage by Anton Vidishchev
Sql saturday azure storage by Anton VidishchevAlex Tumanoff
 
Navigation map factory by Alexey Klimenko
Navigation map factory by Alexey KlimenkoNavigation map factory by Alexey Klimenko
Navigation map factory by Alexey KlimenkoAlex Tumanoff
 
Serialization and performance by Sergey Morenets
Serialization and performance by Sergey MorenetsSerialization and performance by Sergey Morenets
Serialization and performance by Sergey MorenetsAlex Tumanoff
 
Игры для мобильных платформ by Алексей Рыбаков
Игры для мобильных платформ by Алексей РыбаковИгры для мобильных платформ by Алексей Рыбаков
Игры для мобильных платформ by Алексей РыбаковAlex Tumanoff
 
Android sync adapter
Android sync adapterAndroid sync adapter
Android sync adapterAlex Tumanoff
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey TeplyakovAlex Tumanoff
 
Bdd by Dmitri Aizenberg
Bdd by Dmitri AizenbergBdd by Dmitri Aizenberg
Bdd by Dmitri AizenbergAlex Tumanoff
 
Неформальные размышления о сертификации в IT
Неформальные размышления о сертификации в ITНеформальные размышления о сертификации в IT
Неформальные размышления о сертификации в ITAlex Tumanoff
 
Разработка расширений Firefox
Разработка расширений FirefoxРазработка расширений Firefox
Разработка расширений FirefoxAlex Tumanoff
 
"AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So...
"AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So..."AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So...
"AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So...Alex Tumanoff
 
Patterns of parallel programming
Patterns of parallel programmingPatterns of parallel programming
Patterns of parallel programmingAlex Tumanoff
 
Lambda выражения и Java 8
Lambda выражения и Java 8Lambda выражения и Java 8
Lambda выражения и Java 8Alex Tumanoff
 
XP практики в проектах с тяжелой наследственностью
XP практики в проектах с тяжелой наследственностьюXP практики в проектах с тяжелой наследственностью
XP практики в проектах с тяжелой наследственностьюAlex Tumanoff
 

Plus de Alex Tumanoff (20)

Sql server 2019 New Features by Yevhen Nedaskivskyi
Sql server 2019 New Features by Yevhen NedaskivskyiSql server 2019 New Features by Yevhen Nedaskivskyi
Sql server 2019 New Features by Yevhen Nedaskivskyi
 
Odessa .net-user-group-sql-server-2019-hidden-gems by Denis Reznik
Odessa .net-user-group-sql-server-2019-hidden-gems by Denis ReznikOdessa .net-user-group-sql-server-2019-hidden-gems by Denis Reznik
Odessa .net-user-group-sql-server-2019-hidden-gems by Denis Reznik
 
Azure data bricks by Eugene Polonichko
Azure data bricks by Eugene PolonichkoAzure data bricks by Eugene Polonichko
Azure data bricks by Eugene Polonichko
 
Sdlc by Anatoliy Anthony Cox
Sdlc by  Anatoliy Anthony CoxSdlc by  Anatoliy Anthony Cox
Sdlc by Anatoliy Anthony Cox
 
Kostenko ux november-2014_1
Kostenko ux november-2014_1Kostenko ux november-2014_1
Kostenko ux november-2014_1
 
"Drools: декларативная бизнес-логика в Java-приложениях" by Дмитрий Контрерас...
"Drools: декларативная бизнес-логика в Java-приложениях" by Дмитрий Контрерас..."Drools: декларативная бизнес-логика в Java-приложениях" by Дмитрий Контрерас...
"Drools: декларативная бизнес-логика в Java-приложениях" by Дмитрий Контрерас...
 
Sql saturday azure storage by Anton Vidishchev
Sql saturday azure storage by Anton VidishchevSql saturday azure storage by Anton Vidishchev
Sql saturday azure storage by Anton Vidishchev
 
Navigation map factory by Alexey Klimenko
Navigation map factory by Alexey KlimenkoNavigation map factory by Alexey Klimenko
Navigation map factory by Alexey Klimenko
 
Serialization and performance by Sergey Morenets
Serialization and performance by Sergey MorenetsSerialization and performance by Sergey Morenets
Serialization and performance by Sergey Morenets
 
Игры для мобильных платформ by Алексей Рыбаков
Игры для мобильных платформ by Алексей РыбаковИгры для мобильных платформ by Алексей Рыбаков
Игры для мобильных платформ by Алексей Рыбаков
 
Android sync adapter
Android sync adapterAndroid sync adapter
Android sync adapter
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey Teplyakov
 
Bdd by Dmitri Aizenberg
Bdd by Dmitri AizenbergBdd by Dmitri Aizenberg
Bdd by Dmitri Aizenberg
 
Неформальные размышления о сертификации в IT
Неформальные размышления о сертификации в ITНеформальные размышления о сертификации в IT
Неформальные размышления о сертификации в IT
 
Разработка расширений Firefox
Разработка расширений FirefoxРазработка расширений Firefox
Разработка расширений Firefox
 
"AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So...
"AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So..."AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So...
"AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So...
 
Patterns of parallel programming
Patterns of parallel programmingPatterns of parallel programming
Patterns of parallel programming
 
Lambda выражения и Java 8
Lambda выражения и Java 8Lambda выражения и Java 8
Lambda выражения и Java 8
 
XP практики в проектах с тяжелой наследственностью
XP практики в проектах с тяжелой наследственностьюXP практики в проектах с тяжелой наследственностью
XP практики в проектах с тяжелой наследственностью
 
Anti patterns
Anti patternsAnti patterns
Anti patterns
 

Bytecode

  • 2. План Что такое байт-код? Основные понятия Соответствие между Java и байт-кодом Библиотека ASM JDK 5-7
  • 3. Байт-код Промежуточное представление между Java и машинным кодом Исходный код переводится в байт-код максимально близко либо выражается его средствами Большинство ограничений Java распространяются на байт-код. Source: http://viralpatel.net/blogs/java-virtual-machine-an-inside-story/
  • 4. Что можно делать с байт-кодом? Читать – javap – Анализ классов – Анализ и модификация стороннего кода Создавать – Генерация классов на лету – Компиляция Изменять – AOP – Инструментация – Профилирование Понимать – Франкенбилды
  • 5. Почему он нужен редко? Декомпиляторы – Jad Существующие средства AOP – AspectJ java.lang.reflect.Proxy
  • 6. Средства для работы с байт-кодом ASM CGLIB BCEL SERP Javassist Jasmin Jamaica
  • 7. План Что такое байт-код? Основные понятия Соответствие между Java и байт-кодом Библиотека ASM JDK 5-7
  • 8. Структура класса Все компилируется в .class – Классы – Интерфейсы • <clinit> – Аннотации • java.lang.annotation.Annotation – Перечисления • java.lang.Enum Source: http://viralpatel.net/blogs/tutorial-java-class-file-format-revealed/
  • 9. Стек и регистры Регистры используются для локальных переменных Операции производятся со стеком, например: – public float sum(int a, int b) { return a + b; } становится • iload_1 // положить в стек значение параметра a • iload_2 // положить в стек значение параметра b • Iadd // сложить два верхних элемента стека, результат в стек • I2f // сконвертировать верхний элемент стека из int в float • freturn // вернуть верхний элемент стека В стеке и регистрах хранятся 32-битные значения long и double занимают две ячейки
  • 10. Сигнатуры Z = boolean, C, B, S, I, J = long, F, D Массив: [[Z = boolean[][] Объект: Ljava/lang/Integer; = java.lang.Integer Метод: (II)V = void(int, int) Пример использования: – private Object x = new StringBuffer(); становится • aload_0 • invokespecial java/lang/Object."<init>":()V • aload_0 • new java/lang/StringBuffer • dup • invokespecial java/lang/StringBuffer."<init>":()V • putfield x:Ljava/lang/Object; • return
  • 11. Опкоды Соглашения – Приставки • b, c, s, i, l, f, d • a = reference – iload_0 = iload 0 Работа со стеком – Занесение значения регистра в стек • aload, dload, fload, iload, lload – Перенос верхнего значения из стека в регистр • astore, dstore, fstore, istore, lstore – Запись константы в стек • aconst_null, dconst_{0,1}, fconst_{0,1,2}, iconst_{m1,0,1,2,3,4,5}, lco nst_{0,1}, ldc, ldc2, bipush, sipush – Изменение вершины стека • pop, pop2, dup, dup2, dup2_x1, dup2_x2, dup_x1, dup_x2, swap
  • 12. Опкоды Арифметические операции – dadd, ddiv, dmul, dneg, drem, dsub, fadd, fdiv, fmul, fneg, frem, fs ub, iadd, idiv, iinc, imul, ineg, irem, isub, ladd, ldiv, lmul, lneg, lre m, lsub Логические операции и операции сдвига – iand, ior, ishl, ishr, iushr, ixor, land, lor, lshl, lshr, lushr, lxor Приведение типа – d2f, d2i, d2l, f2d, f2i, f2l, i2b, i2c, i2d, i2f, i2l, i2s, l2d, l2f, l2i Безусловный переход – goto, jsr, ret Условный переход – if_acmpeq, if_acmpne, if_icmpeq, if_icmpge, if_icmpgt, if_icmple, if_icmplt, if_icmpne, ifeq, ifge, ifgt, ifle, iflt, ifne, ifnonnull, ifnull
  • 13. Опкоды Проверка условий – dcmpg, dcmpl, fcmpg, fcmpl, lcmp, instanceof Работа с массивами – Создание и получение размера • anewarray, arraylength, multianewarray, newarray – Установка значения элемента • aastore, bastore, castore, dastore, fastore, iastore, lastore, sastore – Получение значения элемента • aaload, baload, caload, daload, faload, iaload, laload, saload Возврат значения и выбрасывание исключений – areturn, dreturn, freturn, ireturn, lreturn, return, athrow
  • 14. Опкоды Синхронизация – monitorenter, monitorexit Создание объекта – new Многовариантный выбор – lookupswitch, tableswitch Проверка типа – checkcast Пустой оператор – nop Префикс 16-битных аргументов – wide
  • 15. Методы и поля Опкоды для вызова методов: – invokedynamic – invokeinterface – invokespecial – invokestatic – Invokevirtual Чтение и запись значений полей – getfield, getstatic, putfield, putstatic
  • 16. Сигнатуры Всякое обращение к методу или полю содержит сигнатуру Никакого встраивания – Кроме static final полей с инициализатором • public static int SIZE = 5; • public static Object x = new Object(); • public static String NAME = “name”; • public static String NAME; static {NAME = “name”;} • interface IA { public String x = new Object().toString(); } Метод или поле выбирается по имени и сигнатуре Специальные методы <init> и <clinit>
  • 17. Отладочная информация и исключения Code: public void myMethod() { 0: iconst_0 1: istore_1 try { 2: goto 10 int x = 0; 5: astore_1 } catch (ArithmeticException e) { 6: aload_1 e.printStackTrace(); 7: invokevirtual #23; //Method java/lang/ArithmeticException.printStackTrace:()V } 10: return } Exception table: from to target type 0 2 5 Class java/lang/ArithmeticException LineNumberTable: line 32: 0 line 33: 5 line 34: 6 line 36: 10 LocalVariableTable: Start Length Slot Name Signature 0 11 0 this LMySample; 2 3 1 x I 6 4 1 e Ljava/lang/ArithmeticException;
  • 18. Верификация Проверка типов Нет переполнения или опустошения стека Нельзя перейти по неправильному адресу Значение записывается в регистр перед чтением из него Объект инициализируется перед его использованием Вызовы методов и доступ к полям допустимы
  • 19. План Что такое байт-код? Основные понятия Соответствие между Java и байт-кодом Библиотека ASM JDK 5-7
  • 20. Классы Все становится классом Внутренние классы, анонимные классы: class MyOuterClass$MyInnerClass { private class MyInnerClass { private int y; private int y; private MyOuterClass this$0; public MyInnerClass(int y) { public MyInnerClass(int y, MyOuterClass $parent) this.y = y; { } this.y = y; } this.this$0 = $parent; } return new static /*synthetic*/ int MyInnerClass(5).y; access$0(MyOuterClass$MyInnerClass c) } return c.y; } } return MyOuterClass$MyInnerClass.access$0(new MyOuterClass$MyInnerClass(5, this));
  • 21. Инициализация Инициализация полей переносится в конструктор / статические конструктор, кроме примитивных и строковых констант private byte[] myArray = {1,2,3,4,5} – byte[] x = new byte[5]; – x[0] = 1 – … x[4] = 5 – this.myArray = x; У интерфейса может быть метод <clinit>, содержащий код
  • 22. Средства Java в байт-коде String s = x + “ “ + y; – String s = new StringBuilder().append(x).append(“ “).append(y).toString(); Циклы можно записать при помощи условного перехода Тернарый оператор записывается через if-else synchronized(x) {…} – Object $lock = x; – monitorenter($lock); – try { – …; monitorexit($lock); – } catch (Throwable t) { – monitorexit($lock); – throw t; – }
  • 23. План Что такое байт-код? Основные понятия Соответствие между Java и байт-кодом Библиотека ASM JDK 5-7
  • 24. ASM Чтение и создание классов Visitors Tree Analysis XML
  • 25. ASM visitors ClassWriter cw = new ClassWriter(false); cw.visit( ACC_PUBLIC+ACC_ABSTRACT+ACC_INTERFACE, "asm1/Notifier", // class name "java/lang/Object", // super class null, // interfaces "Notifier.java"); // source file cv = cw.visitMethod( ACC_PUBLIC+ACC_ABSTRACT, "addListener", // method name "(Lasm1/Listener;)V", // method descriptor null, // exceptions null); // method attributes cw.visitEnd(); byte[] bytecode = cw.toByteArray(); Source: http://onjava.com/pub/a/onjava/2004/10/06/asm1.html
  • 26. ASM visitors mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V"); mv.visitInsn(RETURN); mv.visitMaxs(1, 1); mv.visitEnd(); Source: http://www.ibm.com/developerworks/java/library/j-cwt05125/index.html
  • 27. ASM tree ClassNode classNode=new ClassNode(4);//4 is just the API version number classNode.version=Opcodes.V1_6; classNode.access=Opcodes.ACC_PUBLIC; classNode.signature="Lcom/geekyarticles/asm/Generated;"; classNode.name="com/geekyarticles/asm/Generated"; classNode.superName="java/lang/Object"; MethodNode mainMethod=new MethodNode(4,Opcodes.ACC_PUBLIC|Opcodes.ACC_STATIC,"main", "([Ljava/lang/String;)V",null, null); mainMethod.instructions.add(new FieldInsnNode(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;")); mainMethod.instructions.add(new LdcInsnNode("Hello World!")); mainMethod.instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V")); mainMethod.instructions.add(new InsnNode(Opcodes.RETURN)); classNode.methods.add(mainMethod); public class com.geekyarticles.asm.Generated { public static void main(String args[]) { ClassWriter cw=new ClassWriter(ClassWriter.COMPUTE_MAXS| System.out.println(“Hello World!”); ClassWriter.COMPUTE_FRAMES); } } classNode.accept(cw); Source: http://www.javacodegeeks.com/2012/02/manipulating-java-class-files-with-asm_22.html
  • 28. План Что такое байт-код? Основные понятия Соответствие между Java и байт-кодом Библиотека ASM JDK 5-7
  • 29. foreach loop for (Type t : i) aload_1 aload_1 dup invokeinterface java/util/Collection.iterator:()Ljava/util/Iterator; astore 5 astore_3 arraylength goto 27 istore 4 aload_3 iconst_0 invokeinterface java/util/Iterator.next:()Ljava/lang/Object; istore_3 checkcast class java/lang/String goto 27 astore_2 aload5 getstatic java/lang/System.out:Ljava/io/PrintStream; iload_3 aload_2 iaload invokevirtual java/io/PrintStream.println:(Ljava/lang/String;)V istore_2 aload_3 getstatic java/lang/System.out:Ljava/io/PrintStream; invokeinterface java/util/Iterator.hasNext:()Z iload_2 ifne 10 invokevirtual java/io/PrintStream.println:(I)V return iinc 3, 1 iload_3 iload4 if_icmplt 12 return
  • 30. Enum Enums – создается потомок java.lang.Enum Compiled from "MyEnum.java" public final class MyEnum extends java.lang.Enum{ public static final MyEnum A; public static final MyEnum B; public static final MyEnum C; public static final MyEnum D; private static final MyEnum[] ENUM$VALUES; static {}; private MyEnum(java.lang.String, int); public static MyEnum[] values(); public static MyEnum valueOf(java.lang.String); }
  • 31. Изменения в JDK 5 Varargs – void myMethod(long a, int… b) -> void myMethod(long a, int[] b) Autoboxing – Добавляются вызовы методов Annotations – создается потомок java.lang.annotation.Annotation – Аннотации добавлены в формат .class – LOCAL_VARIABLE target Compiled from "MyAnnotation.java" public interface MyAnnotation extends java.lang.annotation.Annotation{ public abstract java.lang.String name(); public abstract int count(); }
  • 32. Generics public class GenericsTest<T, Z extends List<T>> { public int myTest(Z z) { return z.size(); } } public int myTest(java.util.List); Code: 0: aload_1 1: invokeinterface #20, 1; //InterfaceMethod java/util/List.size:()I 6: ireturn }
  • 33. Generics public final class GenericsTest2<T, Z extends ArrayList<T>> extends GenericsTest<T, Z> { public int myTest(Z z) { return z.size() + 1; } } public int myTest(java.util.ArrayList); Code: 0: aload_1 1: invokevirtual #20; //Method java/util/ArrayList.size:()I 4: iconst_1 5: iadd 6: ireturn public int myTest(java.util.List); Code: 0: aload_0 1: aload_1 2: checkcast #21; //class java/util/ArrayList 5: invokevirtual #30; //Method myTest:(Ljava/util/ArrayList;)I 8: ireturn }
  • 34. JDK 7 invokedynamic – Аналог invokestatic, но сигнатура не содежит имени класса / интерфейса
  • 35. Thank you for your attention!

Notes de l'éditeur

  1. Hello and welcome to Sigma Ukraine!