Your SlideShare is downloading. ×
0
Основы байт-кода Java
ПланЧто такое байт-код?Основные понятияСоответствие между Java и байт-кодомБиблиотека ASMJDK 5-7
Байт-кодПромежуточноепредставление между Java имашинным кодомИсходный код переводится вбайт-код максимальноблизко либо выр...
Что можно делать с байт-кодом?Читать– javap– Анализ классов– Анализ и модификация стороннего кодаСоздавать– Генерация клас...
Почему он нужен редко?Декомпиляторы– JadСуществующие средства AOP– AspectJjava.lang.reflect.Proxy
Средства для работы с байт-кодомASMCGLIBBCELSERPJavassistJasminJamaica
ПланЧто такое байт-код?Основные понятияСоответствие между Java и байт-кодомБиблиотека ASMJDK 5-7
Структура классаВсе компилируется в .class– Классы– Интерфейсы    • <clinit>– Аннотации    • java.lang.annotation.Annotati...
Стек и регистрыРегистры используются для локальных переменныхОперации производятся со стеком, например:– public float sum(...
СигнатурыZ = boolean, C, B, S, I, J = long, F, DМассив: [[Z = boolean[][]Объект: Ljava/lang/Integer; = java.lang.IntegerМе...
ОпкодыСоглашения– Приставки    • b, c, s, i, l, f, d    • a = reference– iload_0 = iload 0Работа со стеком– Занесение знач...
ОпкодыАрифметические операции– dadd, ddiv, dmul, dneg, drem, dsub, fadd, fdiv, fmul, fneg, frem, fs  ub, iadd, idiv, iinc,...
ОпкодыПроверка условий– dcmpg, dcmpl, fcmpg, fcmpl, lcmp, instanceofРабота с массивами– Создание и получение размера    • ...
ОпкодыСинхронизация– monitorenter, monitorexitСоздание объекта– newМноговариантный выбор– lookupswitch, tableswitchПроверк...
Методы и поляОпкоды для вызова методов:–   invokedynamic–   invokeinterface–   invokespecial–   invokestatic–   Invokevirt...
СигнатурыВсякое обращение к методу или полю содержит сигнатуруНикакого встраивания– Кроме static final полей с инициализат...
Отладочная информация и исключения Code:                                                 public void myMethod() {  0: icon...
ВерификацияПроверка типовНет переполнения или опустошения стекаНельзя перейти по неправильному адресуЗначение записывается...
ПланЧто такое байт-код?Основные понятияСоответствие между Java и байт-кодомБиблиотека ASMJDK 5-7
Классы     Все становится классом     Внутренние классы, анонимные классы:class MyOuterClass$MyInnerClass {               ...
ИнициализацияИнициализация полей переносится в конструктор /статические конструктор, кроме примитивных и строковыхконстант...
Средства Java в байт-кодеString s = x + “ “ + y; – String s = new StringBuilder().append(x).append(“   “).append(y).toStri...
ПланЧто такое байт-код?Основные понятияСоответствие между Java и байт-кодомБиблиотека ASMJDK 5-7
ASMЧтение и создание классовVisitorsTreeAnalysisXML
ASM visitorsClassWriter cw = new ClassWriter(false);cw.visit( ACC_PUBLIC+ACC_ABSTRACT+ACC_INTERFACE,  "asm1/Notifier", // ...
ASM visitorsmv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);mv.visitCode();mv.visitVarInsn(ALOAD, 0);mv.visit...
ASM treeClassNode classNode=new ClassNode(4);//4 is just the API version numberclassNode.version=Opcodes.V1_6;classNode.ac...
ПланЧто такое байт-код?Основные понятияСоответствие между Java и байт-кодомБиблиотека ASMJDK 5-7
foreach loopfor (Type t : i)aload_1                                                aload_1dup                             ...
Enum  Enums   – создается потомок java.lang.EnumCompiled from "MyEnum.java"public final class MyEnum extends java.lang.Enu...
Изменения в JDK 5    Varargs    – void myMethod(long a, int… b) -> void myMethod(long a, int[] b)    Autoboxing    – Добав...
Genericspublic class GenericsTest<T, Z extends List<T>> {  public int myTest(Z z) {     return z.size();  }}public int myT...
Genericspublic final class GenericsTest2<T, Z extends ArrayList<T>> extendsGenericsTest<T, Z> {  public int myTest(Z z) { ...
JDK 7invokedynamic– Аналог invokestatic, но сигнатура не содежит имени класса /  интерфейса
Thank you for your attention!
Upcoming SlideShare
Loading in...5
×

Bytecode

2,002

Published on

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,002
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
3
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide
  • Hello and welcome to Sigma Ukraine!
  • Transcript of "Bytecode"

    1. 1. Основы байт-кода Java
    2. 2. ПланЧто такое байт-код?Основные понятияСоответствие между Java и байт-кодомБиблиотека ASMJDK 5-7
    3. 3. Байт-кодПромежуточноепредставление между Java имашинным кодомИсходный код переводится вбайт-код максимальноблизко либо выражается егосредствамиБольшинство ограниченийJava распространяются набайт-код. Source: http://viralpatel.net/blogs/java-virtual-machine-an-inside-story/
    4. 4. Что можно делать с байт-кодом?Читать– javap– Анализ классов– Анализ и модификация стороннего кодаСоздавать– Генерация классов на лету– КомпиляцияИзменять– AOP– Инструментация– ПрофилированиеПонимать– Франкенбилды
    5. 5. Почему он нужен редко?Декомпиляторы– JadСуществующие средства AOP– AspectJjava.lang.reflect.Proxy
    6. 6. Средства для работы с байт-кодомASMCGLIBBCELSERPJavassistJasminJamaica
    7. 7. ПланЧто такое байт-код?Основные понятияСоответствие между Java и байт-кодомБиблиотека ASMJDK 5-7
    8. 8. Структура классаВсе компилируется в .class– Классы– Интерфейсы • <clinit>– Аннотации • java.lang.annotation.Annotation– Перечисления • java.lang.Enum Source: http://viralpatel.net/blogs/tutorial-java-class-file-format-revealed/
    9. 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. 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. 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. 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. 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. 14. ОпкодыСинхронизация– monitorenter, monitorexitСоздание объекта– newМноговариантный выбор– lookupswitch, tableswitchПроверка типа– checkcastПустой оператор– nopПрефикс 16-битных аргументов– wide
    15. 15. Методы и поляОпкоды для вызова методов:– invokedynamic– invokeinterface– invokespecial– invokestatic– InvokevirtualЧтение и запись значений полей– getfield, getstatic, putfield, putstatic
    16. 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. 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; //Methodjava/lang/ArithmeticException.printStackTrace:()V } 10: return } Exception table: from to target type 0 2 5 Class java/lang/ArithmeticExceptionLineNumberTable: 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. 18. ВерификацияПроверка типовНет переполнения или опустошения стекаНельзя перейти по неправильному адресуЗначение записывается в регистр перед чтением из негоОбъект инициализируется перед его использованиемВызовы методов и доступ к полям допустимы
    19. 19. ПланЧто такое байт-код?Основные понятияСоответствие между Java и байт-кодомБиблиотека ASMJDK 5-7
    20. 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(newMyOuterClass$MyInnerClass(5, this));
    21. 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. 22. Средства Java в байт-кодеString s = x + “ “ + y; – String s = new StringBuilder().append(x).append(“ “).append(y).toString();Циклы можно записать при помощи условного переходаТернарый оператор записывается через if-elsesynchronized(x) {…} – Object $lock = x; – monitorenter($lock); – try { – …; monitorexit($lock); – } catch (Throwable t) { – monitorexit($lock); – throw t; – }
    23. 23. ПланЧто такое байт-код?Основные понятияСоответствие между Java и байт-кодомБиблиотека ASMJDK 5-7
    24. 24. ASMЧтение и создание классовVisitorsTreeAnalysisXML
    25. 25. ASM visitorsClassWriter 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 filecv = cw.visitMethod( ACC_PUBLIC+ACC_ABSTRACT, "addListener", // method name "(Lasm1/Listener;)V", // method descriptor null, // exceptions null); // method attributescw.visitEnd();byte[] bytecode = cw.toByteArray(); Source: http://onjava.com/pub/a/onjava/2004/10/06/asm1.html
    26. 26. ASM visitorsmv = 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. 27. ASM treeClassNode classNode=new ClassNode(4);//4 is just the API version numberclassNode.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=newMethodNode(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. 28. ПланЧто такое байт-код?Основные понятияСоответствие между Java и байт-кодомБиблиотека ASMJDK 5-7
    29. 29. foreach loopfor (Type t : i)aload_1 aload_1dup invokeinterface java/util/Collection.iterator:()Ljava/util/Iterator;astore 5 astore_3arraylength goto 27istore 4 aload_3iconst_0 invokeinterface java/util/Iterator.next:()Ljava/lang/Object;istore_3 checkcast class java/lang/Stringgoto 27 astore_2aload5 getstatic java/lang/System.out:Ljava/io/PrintStream;iload_3 aload_2iaload invokevirtual java/io/PrintStream.println:(Ljava/lang/String;)Vistore_2 aload_3getstatic java/lang/System.out:Ljava/io/PrintStream; invokeinterface java/util/Iterator.hasNext:()Ziload_2 ifne 10invokevirtual java/io/PrintStream.println:(I)V returniinc 3, 1iload_3iload4if_icmplt 12return
    30. 30. Enum Enums – создается потомок java.lang.EnumCompiled 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. 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 targetCompiled from "MyAnnotation.java"public interface MyAnnotation extends java.lang.annotation.Annotation{public abstract java.lang.String name();public abstract int count();}
    32. 32. Genericspublic 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. 33. Genericspublic final class GenericsTest2<T, Z extends ArrayList<T>> extendsGenericsTest<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: ireturnpublic 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. 34. JDK 7invokedynamic– Аналог invokestatic, но сигнатура не содежит имени класса / интерфейса
    35. 35. Thank you for your attention!
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×