Java ASM 7 - dlaczego metody visitXXX muszą być wywoływane ścisłej kolejności?

0

Witam

Uczę się biblioteki ASM do edycji kodu bajtowego klas Javy. W dokumentacji do biblioteki pojawia się objaśnienie w jaki sposób dodawać poszczególne elementy np. pola do klasy, oto fragment:

For instance, if you want to add a field to a class you have to insert a new
call to visitField between the original method calls, and you must put this
new call in one of the visit method of your class adapter. You cannot do
this in the visit method, for example, because this may result in a call to
visitField followed by visitSource, visitOuterClass, visitAnnotation
or visitAttribute, which is not valid. You cannot put this new call in
the visitSource, visitOuterClass, visitAnnotation or visitAttribute
methods, for the same reason. The only possibilities are the visitInnerClass,
visitField, visitMethod or visitEnd methods.

Wynika z tego, że nie powinienem wywoływać metody visitField i innych w miejscu, który nie jest zgodny z hierarchią wywołań metod wedle porządku:

visit visitSource? visitOuterClass? ( visitAnnotation | visitAttribute )*
( visitInnerClass | visitField | visitMethod )*
visitEnd

(Gdzie znaczenie znaków ?,*,| jak w wyrażeniach regularnych)

Wywołałem metodę visitField w metodzie visit() klasy ClassVisitor i nic się nie stało, pole zostało dodane do klasy. No więc jakie są konsekwencje nie przestrzengania zaleceń z dokumentacji, nie rozumiem skąd to ograniczenie? Patrzyłem w kod źródlowy, faktycznie metoda accept() od której wszystko się zaczyna wywołuje metody visitXXX w podanej kolejności, ale jaki wpływ na budowe klasy ma nie przestrzeganie tej kolejnośći? Nie wiem. Ktoś może wyjaśnić?

0

Nie wiem jak jest dokładnie tutaj, ale generalnie nie przestrzeganie dokumentacji może zakończyć się nieprzyjemnie w przypadku upgradu wersji - patrz Lombok i migracja na JDK9.

0

Trochę też strzelam, ale może chodzić o to, że później w runetime jeśli metody będą w złej kolejności to JVM może je sobie poprzestawiać i wtedy coś przestanie działać?

0

Serio nikt na tym forum nie bawił się tą biblioteką żeby udzielić mi merytorycznej odpowiedzi? ;p

1 użytkowników online, w tym zalogowanych: 0, gości: 1