Re[4]: MIDletStateMap.getState(...); - AbstractMethodError?
От: Grief Россия Grief-postal.narod.ru
Дата: 15.06.07 15:33
Оценка:
D>
D>abstract class MIDletStateMap {
D>    static MIDletStateMap mapImpl;

D>    public static MIDletState getState(MIDlet midlet) {
D>        return mapImpl.getStateImpl(midlet);
D>    }

D>    protected abstract MIDletState getStateImpl(MIDlet midlet);
D>}
D>

{
public static com.sun.midp.midlet.MIDletState getState(javax.microedition.midlet.MIDlet);
Code:
Stack=2, Locals=1, Args_size=1
0: getstatic #2; //Field mapImpl:Lcom/sun/midp/midlet/MIDletStateMap;
3: aload_0
4: invokevirtual #3; //Method getStateImplLjavax/microedition/midlet/MIDletLcom/sun/midp/midlet/MIDletState;
7: areturn
LineNumberTable:
line 45: 0
LocalVariableTable:
Start Length Slot Name Signature
0 8 0 m Ljavax/microedition/midlet/MIDlet;

protected abstract com.sun.midp.midlet.MIDletState getStateImpl(javax.microedition.midlet.MIDlet);

}

Я и не против, чтобы такой код генерировался. Начну издалека, надеюсь вы мне это простите. И не буду приводить полный байткод, чтобы место не тратить.
Итак, класс javax.microedition.lcdui.Display имеет метод getDisplay. Смотрим егобайт код
public static javax.microedition.lcdui.Display getDisplay(javax.microedition.midlet.MIDlet);
  Code:
   Stack=3, Locals=5, Args_size=1
   0:    getstatic    #22; //Field LCDUILock:Ljava/lang/Object;
   3:    dup
   4:    astore_3
   5:    monitorenter
   6:    aload_0
   7:    invokestatic    #23; //Method com/sun/midp/midlet/MIDletStateMap.getState:(Ljavax/microedition/midlet/MIDlet;)Lcom/sun/midp/midlet/MIDletState;

Обращаем внимание на инструкцию под номером семь. видим вызов статического метода getState из класса com.sun.midp.midlet.MIDletStateMap
Смотрим байт-код этого метода:
public static com.sun.midp.midlet.MIDletState getState(javax.microedition.midlet.MIDlet);
  Code:
   Stack=2, Locals=1, Args_size=1
   0:    getstatic    #2; //Field mapImpl:Lcom/sun/midp/midlet/MIDletStateMap;
   3:    aload_0
   4:    invokevirtual    #3; //Method getStateImpl:(Ljavax/microedition/midlet/MIDlet;)Lcom/sun/midp/midlet/MIDletState;
   7:    areturn
  LineNumberTable: 
   line 45: 0
  LocalVariableTable: 
   Start  Length  Slot  Name   Signature
   0      8      0    m       Ljavax/microedition/midlet/MIDlet;

обращаем внимание на инструкцию номер четыре и видим вызов абстрактного метода этого же класса.
Естесственно я абсолютно уверен в правильности байт-кода явы машины, поэтому очевидно, что я упускаю какую-то деталь. Объясните пожалуйста, где здесь вообще присутствует намек на переопределенный абстрактный метод? Да кажется даже если метод переопределен — разве байткод не будет вызывать кодом invokevirtual именно переопределенный метод, а не абстрактный?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.