Bytecode
Upcoming SlideShare
Loading in...5
×
 

Bytecode

on

  • 2,247 views

 

Statistics

Views

Total Views
2,247
Views on SlideShare
928
Embed Views
1,319

Actions

Likes
2
Downloads
2
Comments
0

8 Embeds 1,319

http://odjug.blogspot.com 1291
http://odjug.blogspot.ru 8
http://odjug.blogspot.nl 7
http://odjug.blogspot.ca 5
http://odjug.blogspot.de 4
http://odjug.blogspot.hu 2
http://webcache.googleusercontent.com 1
http://odjug.blogspot.co.uk 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • Hello and welcome to Sigma Ukraine!

Bytecode Bytecode Presentation Transcript

  • Основы байт-кода Java
  • ПланЧто такое байт-код?Основные понятияСоответствие между Java и байт-кодомБиблиотека ASMJDK 5-7
  • Байт-кодПромежуточноепредставление между Java имашинным кодомИсходный код переводится вбайт-код максимальноблизко либо выражается егосредствамиБольшинство ограниченийJava распространяются набайт-код. Source: http://viralpatel.net/blogs/java-virtual-machine-an-inside-story/
  • Что можно делать с байт-кодом?Читать– javap– Анализ классов– Анализ и модификация стороннего кодаСоздавать– Генерация классов на лету– КомпиляцияИзменять– AOP– Инструментация– ПрофилированиеПонимать– Франкенбилды
  • Почему он нужен редко?Декомпиляторы– JadСуществующие средства AOP– AspectJjava.lang.reflect.Proxy
  • Средства для работы с байт-кодомASMCGLIBBCELSERPJavassistJasminJamaica
  • ПланЧто такое байт-код?Основные понятияСоответствие между Java и байт-кодомБиблиотека ASMJDK 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; //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;
  • ВерификацияПроверка типовНет переполнения или опустошения стекаНельзя перейти по неправильному адресуЗначение записывается в регистр перед чтением из негоОбъект инициализируется перед его использованиемВызовы методов и доступ к полям допустимы
  • ПланЧто такое байт-код?Основные понятияСоответствие между Java и байт-кодомБиблиотека ASMJDK 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(newMyOuterClass$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-elsesynchronized(x) {…} – Object $lock = x; – monitorenter($lock); – try { – …; monitorexit($lock); – } catch (Throwable t) { – monitorexit($lock); – throw t; – }
  • ПланЧто такое байт-код?Основные понятияСоответствие между Java и байт-кодомБиблиотека ASMJDK 5-7
  • ASMЧтение и создание классовVisitorsTreeAnalysisXML
  • 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
  • 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
  • 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
  • ПланЧто такое байт-код?Основные понятияСоответствие между Java и байт-кодомБиблиотека ASMJDK 5-7
  • 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
  • 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);}
  • Изменения в 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();}
  • 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}
  • 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}
  • JDK 7invokedynamic– Аналог invokestatic, но сигнатура не содежит имени класса / интерфейса
  • Thank you for your attention!