2011-10-29 9 views
5

używałem javap studiować kod wyprodukowany dla jednego z moich klas i zauważyłem następujący wynik:„fałszywe” wpisy w wyjściu javap lokalnej tabeli

... 
frame_type = 255 /* full_frame */ 
    offset_delta = 11 
    locals = [ class Test, double, int, double, double, bogus, bogus, int, int, class "[D" ] 
    stack = [] 
... 

Jaki jest sens tych „podrobiony” typ/zmienne wpisy w tabeli locals? Jak są one spowodowane? Jaki jest ich wpływ na wynikowy kod?

Plik klasy został utworzony przy użyciu kompilatora Eclipse 3.7, a javap pochodzi z OpenJDK-1.6b22.

+0

można udostępnić źródło tej metody? A może także kod bajtowy? Domyślam się, że pochodzi on z foreach, switch (enum) lub jednej z innych funkcji wymagających kodu wygenerowanego automatycznie przez kompilator. –

Odpowiedz

2

natknąłem this little gem idąc nad dokumentacją Javassist:

BOGUS

public static final Rodzaj BOGUS

Reprezentuje niedostępnych wartości. Kod nie może uzyskać dostępu do wartości reprezentowanej przez typ . Występuje, gdy kod bajtowy ponownie używa pozycji zmiennej lokalnej tabeli dla typów nie łączących się. Przykładem może być skompilowany kod , który używa tej samej pozycji dla typu pierwotnego w jednej gałęzi i typu odniesienia w innej gałęzi.

Przypuszczam, że ta dwuznaczność jest to, co powoduje, że „fałszywe” wpisy w tabeli locals także ...