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ć?