Rozwiązywałem sobie wczoraj zadanie z .netowego reverse engineeringu przy użyciu dnSpy i naszła mnie taka myśl, czy w Javie istnieją narzędzia o podobnych możliwościach.
W tym konkretnym przypadku w zadaniu generowana była dynamicznie klasa z jakąśtam metodą, refleksją tworzona instancja i metoda wywoływana.
I teraz gdyby to była java, to jedyny sposób jaki znam, żeby coś z tym zrobić, to wpiąć debugger po tym jak wygenerowano/odszyfrowano bajtkod klasy, zrzucić to do pliku i potem otworzyć sobie taki plik .class i popatrzeć na bajtkod/wynik dekompilacji. I jakbyśmy chcieli po tym debugować, to trzeba by to wrzucić sobie do projektu jako libkę i zrobić jakiegoś maina który to zawoła.
A taki dnSpy pozwolił po prostu zrobić step into
debuggerem i zrobił to wszystko automatycznie, tzn. pokazał mi faktycznie w jakim kodzie wylądowałem i mogłem sobie po nim nadal wygodnie debugować, mimo że ten kod istniał tylko w pamięci.
IntelliJ pozwala pokazać bajtkod klasy, dekompiluje pliki .class w locie i pozwala po nich debugować, ale nie tyczy się to kodu dynamicznie wrzuconego do classloadera w runtime. Możemy zrobić step into
ale nie pokaże nam ani bajtkodu ani tym bardziej jego zdekompilowanej postaci, więc możemy co najwyżej stepować sobie na ślepo.
Jest jakiś magiczny tool o którym nie wiem? :) Jest to o tyle ciekawe, że Java ma całą masę bibliotek o frameworków które robią modyfikacje / generacje kodu w runtime (wszelkie aop, dynamiczne proxy itd).