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 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;
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 именно переопределенный метод, а не абстрактный?