Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работаем с байткодом 
:(
    Опции темы
 
Была ли данная информация вам интересна?
Да [ 72 ]  [84.71%]
Нет [ 4 ]  [4.71%]
По барабану [ 9 ]  [10.59%]
Всего проголосовавших: 85
В этом опросе возможен один вариант ответа
Гости не могут голосовать 
polosatij
Дата 1.12.2004, 02:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 1
Всего: 8



Цитата(Domestic @ 30.11.2004, 23:46)
А какая у тебя JDK? 1.4.03


1.4.2_01

да, я работаю с JBuilder он мне наиболее симпотичен smile
я так же заметил, что код компилированный от JBuilder-а не может быть дизассемблированн sun-овским javap. может это только совпадение.. но уже 3 раза попадал на такой случай smile


--------------------
PM   Вверх
Domestic Cat
Дата 1.12.2004, 04:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Цитата(polosatij @ 30.11.2004, 17:24)
я так же заметил, что код компилированный от JBuilder-а не может быть дизассемблированн sun-овским javap. может это только совпадение.. но уже 3 раза попадал на такой случай smile


smile

------------------------------------------------------------

Байткод для массивов, свитчей и иксепшнов

В общем, это краткое изложение написанного в спецификации. Я написал один класс с 4 методами: созданием массивов, 2 метода со switch'ами и 1 с иксепшн хэндлингом:
Код

public class Test
{
public void doArrays()
{
   int[] ia = new int[10];
    Object [][] oa = new Object[12][2];
}

public void doSwitch(int i)
{
   switch (i)
   {
    case (0) : i++; break;
    case(1) : i++; break;
    case(2) : i++; break;
    default : i--;
   }
}

public void doSwitch2(int i)
{
   switch (i)
   {
    case (10) : i++; break;
    case(100) : i++; break;
    default : i--;
   }
}

public void doException()
{
   int x = 0;
   try
   {
    Thread.sleep(100);
   }
   catch (InterruptedException ie)
   {
    x++;  
   }
   catch (Exception e)
   {
    x--;
   }
   finally
   {
    x = 0;
   }
}
}

Полный байткод с пулом я приводить не буду, помещу только куски для экономии места.
1. Массивы
Код

public void doArrays();
 Code:
  Stack=2, Locals=3, Args_size=1
  0: bipush 10
  2: newarray int
  4: astore_1
  5: bipush 12
  7: iconst_2
  8: multianewarray #2,  2; //class "[[Ljava/lang/Object;"
  12: astore_2
  13: return

Одномерный массив создается опкодом [a]newarray <type>, при этом на стеке должен лежать размер массива. (опкод anewarray созает массив объектов, newarray - массив примитивов) Многомерный массив создается так же, но инструкцией multi[a]newarray

2. switch

Получаем вот что:
Код

public void doSwitch(int);
 Code:
  Stack=1, Locals=2, Args_size=2
  0: iload_1
  1: tableswitch{ //0 to 2
 0: 28;
 1: 34;
 2: 40;
 default: 46 }
  28: iinc 1, 1
  31: goto 49
  34: iinc 1, 1
  37: goto 49
  40: iinc 1, 1
  43: goto 49
  46: iinc 1, -1
  49: return

public void doSwitch2(int);
 Code:
  Stack=1, Locals=2, Args_size=2
  0: iload_1
  1: lookupswitch{ //2
 10: 28;
 100: 34;
 default: 40 }
  28: iinc 1, 1
  31: goto 43
  34: iinc 1, 1
  37: goto 43
  40: iinc 1, -1
  43: return


Свитчи с непрерывным диапазоном case'ов (0-1-2-деафулт) компилируются в tableswitch. В остальных случаях используется lookupswitch. Кстати, если значений всего два (например 1-2-дефаулт), будет использован lookupswitch.

3. Иксепшны
Код

public void doException();
 Code:
  Stack=2, Locals=4, Args_size=1
  0: iconst_0
  1: istore_1
  2: ldc2_w #3; //long 100l
  5: invokestatic #5; //Method java/lang/Thread.sleep:(J)V
  8: iconst_0
  9: istore_1
  10: goto 36
  13: astore_2
  14: iinc 1, 1
  17: iconst_0
  18: istore_1
  19: goto 36
  22: astore_2
  23: iinc 1, -1
  26: iconst_0
  27: istore_1
  28: goto 36
  31: astore_3
  32: iconst_0
  33: istore_1
  34: aload_3
  35: athrow
  36: return
 Exception table:
  from   to  target type
    2     8    13   Class java/lang/InterruptedException
    2     8    22   Class java/lang/Exception
    2     8    31   any
   13    17    31   any
   22    26    31   any
   31    32    31   any


Код хорош тем, что после него начинаешь четко представлять, что такое finally smile
Он превратился в строки 87-10, то есть он идет непосредственно за Thread.sleep(). Кроме того, он же стал строками 17-18, 26-27. finally на самом деле занял 6 байт, тогда как собственно код внутри него весит всего 2 байта!
Первый catch стал строками 13-17, второй catch - 22-26. JVM добавила "перестраховочный" catch, ловящий иксепшны из первых двух кетчей и перебрасывающий возможный иксепшн.
Бросание иксепшна сопровождается потерей фрейма и всего его содержимого.

Это сообщение отредактировал(а) Domestic Cat - 1.12.2004, 05:18


--------------------

PM   Вверх
Domestic Cat
Дата 1.12.2004, 05:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Чтобы иметь еще более четкое представление о том, как устроен class файл, полезно стянуть JCD дизасм (в аттачменте, для виндов), запустить его, и посмотреть любой класс файл. JCD дает более подробную информацию, чем javap -verbose, в частности, модификаторы полей и методов. Так, для предыдыщей программы получаем:
Код

Disassembling: C:\javafiles\Test.class

--------        ------------------------------        -----
OFFSET                   FIELD NAME                  VALUE
--------        ------------------------------        -----

00000000        Signature                             CAFE BABE
00000004        Minor Version                         0
00000006        Major Version                         49

Constant Pool

00000008        Constant Pool Count                   31
0000000a        CONSTANT_Methodref                    Entry (1) Class (9) Name/Type (21)
0000000f        CONSTANT_Class                        Entry (2) (22)
00000012        CONSTANT_Long                         Entry (3) 100
0000001b        CONSTANT_Methodref                    Entry (5) Class (23) Name/Type (24)
00000020        CONSTANT_Class                        Entry (6) (25)
00000023        CONSTANT_Class                        Entry (7) (26)
00000026        CONSTANT_Class                        Entry (8) (27)
00000029        CONSTANT_Class                        Entry (9) (28)
0000002c        CONSTANT_Utf8                         Entry (10) <init>
00000035        CONSTANT_Utf8                         Entry (11) ()V
0000003b        CONSTANT_Utf8                         Entry (12) Code
00000042        CONSTANT_Utf8                         Entry (13) LineNumberTable
00000054        CONSTANT_Utf8                         Entry (14) doArrays
0000005f        CONSTANT_Utf8                         Entry (15) doSwitch
0000006a        CONSTANT_Utf8                         Entry (16) (I)V
00000071        CONSTANT_Utf8                         Entry (17) doSwitch2
0000007d        CONSTANT_Utf8                         Entry (18) doException
0000008b        CONSTANT_Utf8                         Entry (19) SourceFile
00000098        CONSTANT_Utf8                         Entry (20) Test.java
000000a4        CONSTANT_NameAndType                  Entry (21) Name (10) Type (11)
000000a9        CONSTANT_Utf8                         Entry (22) [[Ljava/lang/Object;
000000c0        CONSTANT_Class                        Entry (23) (29)
000000c3        CONSTANT_NameAndType                  Entry (24) Name (30) Type (31)
000000c8        CONSTANT_Utf8                         Entry (25) java/lang/InterruptedException
000000e9        CONSTANT_Utf8                         Entry (26) java/lang/Exception
000000ff        CONSTANT_Utf8                         Entry (27) Test
00000106        CONSTANT_Utf8                         Entry (28) java/lang/Object
00000119        CONSTANT_Utf8                         Entry (29) java/lang/Thread
0000012c        CONSTANT_Utf8                         Entry (30) sleep
00000134        CONSTANT_Utf8                         Entry (31) (J)V

0000013b        Access Flags                          ACC_PUBLIC ACC_SUPER
0000013d        This Class                            (8)
0000013f        Super Class                           (9)

Interfaces

00000141        Interfaces Count                      0

Fields

00000143        Fields Count                          0

Methods

00000145        Methods Count                         5

Method #1

00000147        Access Flags                          ACC_PUBLIC
00000149        Name                                  (10)
0000014b        Type                                  (11)
0000014d        Attributes Count                      1
0000014f        Attribute Name                        (12)
00000151        Bytes Count                           29
00000155        Max Stack                             1
00000157        Max Locals                            1
00000159        Code Count                            5

      0        aload_0
      1        invokespecial (1)
      4        return

00000162        Handlers Count                        0
00000164        Attributes Count                      1
00000166        Attribute Name                        (13)
00000168        Bytes Count                           6
0000016c        Lines Count                           1
0000016e        Start PC                              0
00000170        Line Number                           1

Method #2

00000172        Access Flags                          ACC_PUBLIC
00000174        Name                                  (14)
00000176        Type                                  (11)
00000178        Attributes Count                      1
0000017a        Attribute Name                        (12)
0000017c        Bytes Count                           46
00000180        Max Stack                             2
00000182        Max Locals                            3
00000184        Code Count                            14

      0        bipush 10
      2        newarray int
      4        astore_1
      5        bipush 12
      7        iconst_2
      8        multianewarray (2) 2
     12        astore_2
     13        return

00000196        Handlers Count                        0
00000198        Attributes Count                      1
0000019a        Attribute Name                        (13)
0000019c        Bytes Count                           14
000001a0        Lines Count                           3
000001a2        Start PC                              0
000001a4        Line Number                           5
000001a6        Start PC                              5
000001a8        Line Number                           6
000001aa        Start PC                              13
000001ac        Line Number                           7

Method #3

000001ae        Access Flags                          ACC_PUBLIC
000001b0        Name                                  (15)
000001b2        Type                                  (16)
000001b4        Attributes Count                      1
000001b6        Attribute Name                        (12)
000001b8        Bytes Count                           94
000001bc        Max Stack                             1
000001be        Max Locals                            2
000001c0        Code Count                            50

      0        iload_1
      1        tableswitch
      4        Default = 46
      8        Low = 0, High = 2
     16        Offset = 28
     20        Offset = 34
     24        Offset = 40
     28        iinc 1 1
     31        goto 49
     34        iinc 1 1
     37        goto 49
     40        iinc 1 1
     43        goto 49
     46        iinc 1 -1
     49        return

000001f6        Handlers Count                        0
000001f8        Attributes Count                      1
000001fa        Attribute Name                        (13)
000001fc        Bytes Count                           26
00000200        Lines Count                           6
00000202        Start PC                              0
00000204        Line Number                           11
00000206        Start PC                              28
00000208        Line Number                           13
0000020a        Start PC                              34
0000020c        Line Number                           14
0000020e        Start PC                              40
00000210        Line Number                           15
00000212        Start PC                              46
00000214        Line Number                           16
00000216        Start PC                              49
00000218        Line Number                           18

Method #4

0000021a        Access Flags                          ACC_PUBLIC
0000021c        Name                                  (17)
0000021e        Type                                  (16)
00000220        Attributes Count                      1
00000222        Attribute Name                        (12)
00000224        Bytes Count                           84
00000228        Max Stack                             1
0000022a        Max Locals                            2
0000022c        Code Count                            44

      0        iload_1
      1        lookupswitch
      4        Default = 40
               Key = 10, Offset = 28
               Key = 100, Offset = 34
     28        iinc 1 1
     31        goto 43
     34        iinc 1 1
     37        goto 43
     40        iinc 1 -1
     43        return

0000025c        Handlers Count                        0
0000025e        Attributes Count                      1
00000260        Attribute Name                        (13)
00000262        Bytes Count                           22
00000266        Lines Count                           5
00000268        Start PC                              0
0000026a        Line Number                           22
0000026c        Start PC                              28
0000026e        Line Number                           24
00000270        Start PC                              34
00000272        Line Number                           25
00000274        Start PC                              40
00000276        Line Number                           26
00000278        Start PC                              43
0000027a        Line Number                           28

Method #5

0000027c        Access Flags                          ACC_PUBLIC
0000027e        Name                                  (18)
00000280        Type                                  (11)
00000282        Attributes Count                      1
00000284        Attribute Name                        (12)
00000286        Bytes Count                           165
0000028a        Max Stack                             2
0000028c        Max Locals                            4
0000028e        Code Count                            37

      0        iconst_0
      1        istore_1
      2        ldc2_w (3)
      5        invokestatic (5)
      8        iconst_0
      9        istore_1
     10        goto 36
     13        astore_2
     14        iinc 1 1
     17        iconst_0
     18        istore_1
     19        goto 36
     22        astore_2
     23        iinc 1 -1
     26        iconst_0
     27        istore_1
     28        goto 36
     31        astore_3
     32        iconst_0
     33        istore_1
     34        aload_3
     35        athrow
     36        return

000002b7        Handlers Count                        6
000002b9        Start PC                              2
000002bb        End PC                                8
000002bd        Handler PC                            13
000002bf        Catch Type                            (6)
000002c1        Start PC                              2
000002c3        End PC                                8
000002c5        Handler PC                            22
000002c7        Catch Type                            (7)
000002c9        Start PC                              2
000002cb        End PC                                8
000002cd        Handler PC                            31
000002cf        Catch Type                            (0)
000002d1        Start PC                              13
000002d3        End PC                                17
000002d5        Handler PC                            31
000002d7        Catch Type                            (0)
000002d9        Start PC                              22
000002db        End PC                                26
000002dd        Handler PC                            31
000002df        Catch Type                            (0)
000002e1        Start PC                              31
000002e3        End PC                                32
000002e5        Handler PC                            31
000002e7        Catch Type                            (0)
000002e9        Attributes Count                      1
000002eb        Attribute Name                        (13)
000002ed        Bytes Count                           62
000002f1        Lines Count                           15
000002f3        Start PC                              0
000002f5        Line Number                           32
000002f7        Start PC                              2
000002f9        Line Number                           35
000002fb        Start PC                              8
000002fd        Line Number                           47
000002ff        Start PC                              10
00000301        Line Number                           48
00000303        Start PC                              13
00000305        Line Number                           37
00000307        Start PC                              14
00000309        Line Number                           39
0000030b        Start PC                              17
0000030d        Line Number                           47
0000030f        Start PC                              19
00000311        Line Number                           48
00000313        Start PC                              22
00000315        Line Number                           41
00000317        Start PC                              23
00000319        Line Number                           43
0000031b        Start PC                              26
0000031d        Line Number                           47
0000031f        Start PC                              28
00000321        Line Number                           48
00000323        Start PC                              31
00000325        Line Number                           47
00000327        Start PC                              34
00000329        Line Number                           48
0000032b        Start PC                              36
0000032d        Line Number                           50

Attributes

0000032f        Attributes Count                      1

Attribute #1

00000331        Attribute Name                        (19)
00000333        Bytes Count                           0
00000337        Source File                           (20)



Это сообщение отредактировал(а) Domestic Cat - 1.12.2004, 05:39

Присоединённый файл ( Кол-во скачиваний: 18 )
Присоединённый файл  jcd.zip


--------------------

PM   Вверх
Domestic Cat
Дата 1.12.2004, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Внутренние классы

1. Статик классы
Посмотрим нa примерe кода:
Код

public class SimpleClass
{  
   static int x;
   public static class InnerClass
   {
       public void method()
       {
           x = 0;
       }
   }
   
   public void method2()
   {
       new InnerClass();
   }
}


Дизассемблировав, получим
Код

Compiled from "SimpleClass.java"
public class SimpleClass extends java.lang.Object
 SourceFile: "SimpleClass.java"
 InnerClass:
  public #6= #2 of #4; //InnerClass=class SimpleClass$InnerClass of class SimpleClass
 minor version: 0
 major version: 0
 Constant pool:
const #1 = Method #5.#17; //  java/lang/Object."<init>":()V
const #2 = class #18; //  SimpleClass$InnerClass
const #3 = Method #2.#17; //  SimpleClass$InnerClass."<init>":()V
const #4 = class #19; //  SimpleClass
const #5 = class #20; //  Object
const #6 = Asciz InnerClass;
const #7 = Asciz InnerClasses;
const #8 = Asciz x;
const #9 = Asciz I;
const #10 = Asciz <init>;
const #11 = Asciz ()V;
const #12 = Asciz Code;
const #13 = Asciz LineNumberTable;
const #14 = Asciz method2;
const #15 = Asciz SourceFile;
const #16 = Asciz SimpleClass.java;
const #17 = NameAndType #10:#11;//  "<init>":()V
const #18 = Asciz SimpleClass$InnerClass;
const #19 = Asciz SimpleClass;
const #20 = Asciz java/lang/Object;

{
static int x;

public SimpleClass();
 Code:
  Stack=1, Locals=1, Args_size=1
  0: aload_0
  1: invokespecial #1; //Method java/lang/Object."<init>":()V
  4: return
 LineNumberTable:
  line 3: 0
  line 6: 4

public void method2();
 Code:
  Stack=2, Locals=1, Args_size=1
  0: new #2; //class SimpleClass$InnerClass
  3: dup
  4: invokespecial #3; //Method SimpleClass$InnerClass."<init>":()V
  7: pop
  8: return
 LineNumberTable:
  line 16: 0
  line 17: 8

}



и
Код

Compiled from "SimpleClass.java"
public class SimpleClass$InnerClass extends java.lang.Object
 SourceFile: "SimpleClass.java"
 InnerClass:
  public #16= #3 of #13; //InnerClass=class SimpleClass$InnerClass of class SimpleClass
 minor version: 0
 major version: 0
 Constant pool:
const #1 = Method #4.#12; //  java/lang/Object."<init>":()V
const #2 = Field #13.#14; //  SimpleClass.x:I
const #3 = class #15; //  SimpleClass$InnerClass
const #4 = class #18; //  Object
const #5 = Asciz <init>;
const #6 = Asciz ()V;
const #7 = Asciz Code;
const #8 = Asciz LineNumberTable;
const #9 = Asciz method;
const #10 = Asciz SourceFile;
const #11 = Asciz SimpleClass.java;
const #12 = NameAndType #5:#6;//  "<init>":()V
const #13 = class #19; //  SimpleClass
const #14 = NameAndType #20:#21;//  x:I
const #15 = Asciz SimpleClass$InnerClass;
const #16 = Asciz InnerClass;
const #17 = Asciz InnerClasses;
const #18 = Asciz java/lang/Object;
const #19 = Asciz SimpleClass;
const #20 = Asciz x;
const #21 = Asciz I;

{
public SimpleClass$InnerClass();
 Code:
  Stack=1, Locals=1, Args_size=1
  0: aload_0
  1: invokespecial #1; //Method java/lang/Object."<init>":()V
  4: return
 LineNumberTable:
  line 6: 0

public void method();
 Code:
  Stack=1, Locals=1, Args_size=1
  0: iconst_0
  1: putstatic #2; //Field SimpleClass.x:I
  4: return
 LineNumberTable:
  line 10: 0
  line 11: 4

}


чтобы дизассемблировать вnутренний класс через javap, набираем
Код

cat> javap -verbose SimpleClass.InnerClass > txt.txt


Видно, что constant pool в InnerClass содержит ссылку нa статиk поle класса SimpleClass, благодаря чеmu внутренниe классы имеют доступ к (статик) переменныm внешнего классa.

2. Инстанс классы
Если класс не статик (код я приводить не буду, он такой же, только без модифаеров "static")
получим
Код

Compiled from "SimpleClass.java"
public class SimpleClass extends java.lang.Object
 SourceFile: "SimpleClass.java"
 InnerClass:
  public #6= #2 of #4; //InnerClass=class SimpleClass$InnerClass of class SimpleClass
 minor version: 0
 major version: 0
 Constant pool:
const #1 = Method #5.#17; //  java/lang/Object."<init>":()V
const #2 = class #18; //  SimpleClass$InnerClass
const #3 = Method #2.#19; //  SimpleClass$InnerClass."<init>":(LSimpleClass;)V
const #4 = class #20; //  SimpleClass
const #5 = class #21; //  Object
const #6 = Asciz InnerClass;
const #7 = Asciz InnerClasses;
const #8 = Asciz x;
const #9 = Asciz I;
const #10 = Asciz <init>;
const #11 = Asciz ()V;
const #12 = Asciz Code;
const #13 = Asciz LineNumberTable;
const #14 = Asciz method2;
const #15 = Asciz SourceFile;
const #16 = Asciz SimpleClass.java;
const #17 = NameAndType #10:#11;//  "<init>":()V
const #18 = Asciz SimpleClass$InnerClass;
const #19 = NameAndType #10:#22;//  "<init>":(LSimpleClass;)V
const #20 = Asciz SimpleClass;
const #21 = Asciz java/lang/Object;
const #22 = Asciz (LSimpleClass;)V;

{
int x;

public SimpleClass();
 Code:
  Stack=1, Locals=1, Args_size=1
  0: aload_0
  1: invokespecial #1; //Method java/lang/Object."<init>":()V
  4: return
 LineNumberTable:
  line 3: 0
  line 6: 4

public void method2();
 Code:
  Stack=3, Locals=1, Args_size=1
  0: new #2; //class SimpleClass$InnerClass
  3: dup
  4: aload_0
  5: invokespecial #3; //Method SimpleClass$InnerClass."<init>":(LSimpleClass;)V
  8: pop
  9: return
 LineNumberTable:
  line 16: 0
  line 17: 9

}
Код

Compiled from "SimpleClass.java"
public class SimpleClass$InnerClass extends java.lang.Object
 SourceFile: "SimpleClass.java"
 InnerClass:
  public #22= #4 of #19; //InnerClass=class SimpleClass$InnerClass of class SimpleClass
 minor version: 0
 major version: 0
 Constant pool:
const #1 = Method #5.#17; //  java/lang/Object."<init>":()V
const #2 = Field #4.#18; //  SimpleClass$InnerClass.this$0:LSimpleClass;
const #3 = Field #19.#20; //  SimpleClass.x:I
const #4 = class #21; //  SimpleClass$InnerClass
const #5 = class #24; //  Object
const #6 = Asciz this$0;
const #7 = Asciz LSimpleClass;;
const #8 = Asciz Synthetic;
const #9 = Asciz <init>;
const #10 = Asciz (LSimpleClass;)V;
const #11 = Asciz Code;
const #12 = Asciz LineNumberTable;
const #13 = Asciz method;
const #14 = Asciz ()V;
const #15 = Asciz SourceFile;
const #16 = Asciz SimpleClass.java;
const #17 = NameAndType #9:#14;//  "<init>":()V
const #18 = NameAndType #6:#7;//  this$0:LSimpleClass;
const #19 = class #25; //  SimpleClass
const #20 = NameAndType #26:#27;//  x:I
const #21 = Asciz SimpleClass$InnerClass;
const #22 = Asciz InnerClass;
const #23 = Asciz InnerClasses;
const #24 = Asciz java/lang/Object;
const #25 = Asciz SimpleClass;
const #26 = Asciz x;
const #27 = Asciz I;

{
public SimpleClass$InnerClass(SimpleClass);
 Code:
  Stack=2, Locals=2, Args_size=2
  0: aload_0
  1: invokespecial #1; //Method java/lang/Object."<init>":()V
  4: aload_0
  5: aload_1
  6: putfield #2; //Field this$0:LSimpleClass;
  9: return
 LineNumberTable:
  line 6: 0

public void method();
 Code:
  Stack=2, Locals=1, Args_size=1
  0: aload_0
  1: getfield #2; //Field this$0:LSimpleClass;
  4: iconst_0
  5: putfield #3; //Field SimpleClass.x:I
  8: return
 LineNumberTable:
  line 10: 0
  line 11: 8

}



Интересно тут то, что внутренний класс создается не через пустой (не принимающий аргументов) конструктор!
Такого конструктора у него нет вообще. Зато есть конструктор InnerClass(SimpleClass),
в который передается ссылка на инстанс класса SimpleClass, эта ссылка хранится в поле this$0.
Если добавить в InnerClass конструктор, принимающий аргументы, например public InnerClass(int a), он превратится в <init>:(LSimpleClass;I)V;


--------------------

PM   Вверх
polosatij
Дата 2.12.2004, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 1
Всего: 8



Цитата(Domestic @ 27.11.2004, 08:09)
2: getfield #4; //Field i:I



Берем этот дубликат и вызываем на нем опкод getfield - т.е. ложим на стек поле i.

Код

5: iconst_1
6: iadd



еееееееех.. я всё никак не могу понять.. что обозначает пятая строчка.. что за единица после iconst?

документация: Push int constant.
а почему "1"?


--------------------
PM   Вверх
Domestic Cat
Дата 2.12.2004, 01:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Цитата(polosatij @ 1.12.2004, 16:18)
еееееееех.. я всё никак не могу понять.. что обозначает пятая строчка.. что за единица после iconst?

документация: Push int constant.
а почему "1"?


smile Вообще можно было бы и bipush 1, но тода это заняло бы 2 байта - один на bipush, второй на 1. Поскольку числа -1, 0, 1, 2, 3, 4, 5 в коде встречаются намного чаще, чем 100 или 1234, разработчики сделали соответствующий опкод iconst_<n>, который помещает n на стек, то есть , делает то же самое, что и bipush n, но занимает всего 1 байт.


--------------------

PM   Вверх
Domestic Cat
Дата 2.12.2004, 05:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Локальные и анонимные классы

Эти классы компилируются точно так же, как и внутренние : они получают дополнительный аргумент в конструктор - ссылку на внешний класс, однако эта ссылка хранится как final. Для примера рассмотрим код:
Код

public class Test
{
public void Test1()
{
                class A // локальный класс
                {
 
                 };
                 new A();
}

public void Test2()
{
                  new Thread() {};  // анонимный класс
}

}


Получаем 3 класс файла, из которых я приведу только байткод:
Код

{
public Test();
 Code:
  Stack=1, Locals=1, Args_size=1
// это "dummy" конструктор
  0: aload_0  
  1: invokespecial #1; //Method java/lang/Object."<init>":()V
  4: return
 LineNumberTable:
  line 1: 0

public void Test1();
 Code:
  Stack=3, Locals=1, Args_size=1
  0: new #2; //class Test$1A
  3: dup
  4: aload_0   // передаем локальному классу ссылку на внешний объект
  5: invokespecial #3; //Method Test$1A."<init>":(LTest;)V
  8: pop
  9: return
 LineNumberTable:
  line 9: 0
  line 10: 9

public void Test2();
 Code:
  Stack=3, Locals=1, Args_size=1
  0: new #4; //class Test$1
  3: dup
  4: aload_0    // передаем анонимному классу ссылку на внешний объект
  5: invokespecial #5; //Method Test$1."<init>":(LTest;)V
  8: pop
  9: return
 LineNumberTable:
  line 14: 0
  line 15: 9

}
Код

{
// локальный класс
final Test this$0;

Test$1A(Test);
 Code:
  Stack=2, Locals=2, Args_size=2
// конструктор сохраняет ссылку на родителя и вызывает конструктор класса Object
  0: aload_0
  1: aload_1
  2: putfield #1; //Field this$0:LTest;
  5: aload_0
  6: invokespecial #2; //Method java/lang/Object."<init>":()V
  9: return
 LineNumberTable:
  line 5: 0

}

Код

// анонимный класс
{
final Test this$0;

Test$1(Test);
 Code:
  Stack=2, Locals=2, Args_size=2
// конструктор сохраняет ссылку на родителя и вызывает конструктор класса Thread
  0: aload_0
  1: aload_1
  2: putfield #1; //Field this$0:LTest;
  5: aload_0
  6: invokespecial #2; //Method java/lang/Thread."<init>":()V
  9: return
 LineNumberTable:
  line 14: 0

}


Это сообщение отредактировал(а) Domestic Cat - 2.12.2004, 05:30


--------------------

PM   Вверх
Domestic Cat
Дата 5.12.2004, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Java 1.5

Мне было интересно посмотреть ряд новых вещей, появившихся в Тигре, но к сожалению, ничего интересного тут нет (правда, это можно было предполагать, поскольку многое, те же новые циклы или автобоксинг, не несут ничего нового и просто сокращают работу программиста). Все "новые" конструкции компилируются в стандартный байткод.

Возьмем маленький пример
Код

import java.util.*;
public class Test
{
public void doTest()
{
 HashSet<Integer> set = new HashSet<Integer>(); // 1
 set.add(3); // 2
}

public void doCheck(Object... args) // 3
{}
}


Здесь 3 новых элемента - дженерикс(1), автобоксинг(2) и переменное количество аргументов, для краткости варарг, (3).
Получается из них вот что:
Код

// (1) (2)
public void doTest();
 Code:
  Stack=2, Locals=2, Args_size=1
  0: new #2; //class java/util/HashSet
  3: dup
  4: invokespecial #3; //Method java/util/HashSet."<init>":()V
  7: astore_1
  8: aload_1
  9: iconst_3
  10: invokestatic #4; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
  13: invokevirtual #5; //Method java/util/HashSet.add:(Ljava/lang/Object;)Z
  16: pop
  17: return

Автобоксинг "разавтобоксивается" в обычный valueOf, так что выигрыша в длине байткода нет (хотя есть выигрыш в длине кода, мизерный).
Код

public void doCheck(java.lang.Object[]);
 Code:
  Stack=0, Locals=2, Args_size=2
  0: return

Три точки превращаются в массив (трудно было догадаться) smile.


--------------------

PM   Вверх
Sardar
Дата 5.12.2004, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 4
Всего: 317



Я тоже так подумал что только компилятор усложнили, просто предоставили больше информации для отслеживания типов. Интересно изменился ли формат .class файла, если я создал шаблонную коллекцию и не имея исходников подключаю класс, должен же как то компилятор узнать какой тип я задал в шаблоне.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Domestic Cat
Дата 5.12.2004, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Цитата(Sardar @ 5.12.2004, 04:53)
Интересно изменился ли формат .class файла, если я создал шаблонную коллекцию и не имея исходников подключаю класс, должен же как то компилятор узнать какой тип я задал в шаблоне.


Просто в constant pool добавляется запись обозначающая что класс шаблонный, типа
Код

const #12 = Asciz Ljava/util/HashSet<Ljava/lang/Float;>;;

Все остальное остается прежним.


--------------------

PM   Вверх
Се ля ви
Дата 18.1.2005, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 8
Всего: 127



Вопрос в продолжение темы - примерные алгоритмы работы обфускатора и ингибитора (того же JAD`а).

И кстати, есть ли бесплатные защитники исходников Java?


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
seQira
Дата 8.2.2005, 10:07 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











хорошая статья
  Вверх
Domestic Cat
Дата 15.2.2005, 06:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Цитата
И кстати, есть ли бесплатные защитники исходников Java?


В смысле, бесплатные обфускаторы?
http://java-source.net/open-source/obfuscators

Цитата
Вопрос в продолжение темы - примерные алгоритмы работы обфускатора и ингибитора (того же JAD`а).


http://www-106.ibm.com/developerworks/java/library/j-obfus/
- хорошая статья


Цитата(seQira @ 8.2.2005, 01:07)
хорошая статья


Спасибо


--------------------

PM   Вверх
polosatij
Дата 4.5.2006, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 1
Всего: 8



Цитата(Domestic Cat @  27.11.2004,  08:09 Найти цитируемый пост)
А вот для данного случая, как оказалось, выигрыш дает синхронизированный метод. 



 smile 

хм.. почему? ведь количество байтов не означает скорость! откуда тебе известно, что в данном случае делает JVM с 


Цитата(Domestic Cat @  27.11.2004,  07:24 Найти цитируемый пост)
public int doTest()



 smile 
 


--------------------
PM   Вверх
djGri
Дата 13.6.2006, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 21.2.2005

Репутация: 1
Всего: 3



 smile Насчет Inner classes:
Если объявить как private, то после декомпиляции получится package.
Если объявить как protected, то после декомпиляции получится public.
T.e:
private, package -> package
protected,public  -> public
Как узнать, что Inner classes был объявлен как private/protected ?  smile 
BCEL тоже видит такие классы как написано выше.
 
PM MAIL   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1139 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.