08 lutego 2010

Bajtkod praktycznie z wtyczką Bytecode Outline dla Eclipse

Czasy, kiedy pracowałem wyłącznie w Eclipse IDE dawno minęły i teraz częściej można było mnie spotkać przy NetBeans IDE, a ostatnio nawet przy IntelliJ IDEA (darmowe licencje są dostępne za prezentację podczas spotkań JUGa - chociażby Warszawa JUG).

Bodajże Łukasz Lenart zwrócił mi uwagę na aktualność Zestaw wtyczek Eclipse IDE do sprawnego tworzenia oprogramowania i tak mi jakoś zapadło w pamięci, aby go uaktualnić. W ten sposób szukałem tylko okazji, aby ponownie przysiąść przy Eclipse IDE i niedługo trwało, aż trafiłem na wtyczkę Eclipse Groovy (patrz De gustibus non est disputandum - Eclipse Groovy 2.0.0 dostępny). I tak się dalej potoczyło.

W międzyczasie, zaangażowany byłem w tworzenie poprawki do zgłoszenia OPENEJB-1128 Intercepting generic business method calls fails, które kolejny raz zaprowadziło mnie do org.objectweb.asm.signature.SignatureVisitor. Zawsze marzyło mi się dokładniejsze poznanie projektu ASM, więc kiedy zobaczyłem odnośnik Eclipse plugin na jego stronie głównej, w połączeniu z ostatnim rozpoznaniem wtyczek Eclipse, nie miałem złudzeń, że teraz nadeszła ta chwila. Wchodzę w ASMa!

Na głównej stronie ASM możemy przeczytać:

The best way to learn to use ASM is to write a Java source file that is equivalent to what you want to generate and then use the ASMifier mode of the Bytecode Outline plugin for Eclipse (or the ASMifier tool) to see the equivalent ASM code. If you want to implement a class transformer, write two Java source files (before and after transformation) and use the compare view of the plugin in ASMifier mode to compare the equivalent ASM code.

Nie pozostało mi nic innego, jak rozpoznawać ASM z pomocą wtyczki Bytecode Outline i Eclipse.

Pracuję z Eclipse IDE 3.5 SR1 (edycja Eclipse IDE for Java EE Developers), więc wystarczyło zdefiniować repozytorium wtyczki - http://andrei.gmxhome.de/eclipse/, aby się do niej dobrać. Chwila, dwie i wtyczka była już u mnie.

Niez(wyk)łe jest to, że mimo, że wcześniej czytałem, co daje mi wtyczka, kiedy zobaczyłem te funkcjonalności w działaniu, nie wierzyłem własnym oczom. Niesamowite doznania. Wtyczka Bytecode Outline pozwala na przegląd bajtkodu bez jakiegokolwiek wysiłku (nie wliczając wcześniejszego otwarcia widoku Bytecode :)).

Co mamy każdy widzi, ale widzieć nie oznacza rozumieć, więc warto pobrać wtyczkę i spróbować jej własnoręcznie. W widoku Bytecode otrzymujemy wynik działania ASM na skompilowanej klasie (bardzo podobny wynik otrzymalibyśmy korzystając z javap -c). Jakby tego było mało, w kolejnym widoku Bytecode Reference mamy dokumentację do instrukcji bajtkodu - chociażby w duchu poznawania nowego języka czy też wnętrza Javy, można w prosty sposób rozpocząć jego naukę bez wykrętów w stylu "Nie mam czasu", albo "Eee, to dla zaawansowanych".

Jeśli ktokolwiek mi teraz chociażby nadmieni, że poznawanie bajtkodu to wyzwanie dla najbardziej zaawansowanych (i jeszcze pewnie najmniej obłożonych bieżącym poznawaniem javowych szkieletów aplikacyjnych czy języków alternatywnych na JVM), to będę miał odpowiedź od ręki - wtyczka Bytecode Outline dla Eclipse. Z nią poznawanie rozwiązań typu AspectJ czy mechanizmów instrumentacji (modyfikacji bajtkodu w locie) nie powinien nastręczać problemów. Czyż świat nie wydaje się być prostszy, kiedy znamy klocki, z których jest zbudowany i rozumiemy ich wzajemne interakcje?! Nie mogłem wymarzyć sobie lepszego rozpoczęcia tygodnia!

[Sprostowanie]
Stworzona klasa świadomie upstrzona jest adnotacjami, które semantycznie nie mają większego sensu w tej klasie. Jej celem jest jedynie rozpoznanie tematu wymazywania typów generycznych podczas kompilacji oraz dostępności informacji o adnotacjach w klasach, a adnotacje @WebService i @WebMethod dostępne są w Java SE 6 z pudełka.

p.s. Widok Bytecode dostępny jest w kategorii Java obok kolejnego Bytecode Reference.