Dzisiaj badałem klasy ogromnych aplikacji (jak serwer jboss z aplikacjami) z javaagent i oprzyrządowaniem na moim openjdk 7. Nazwałem retransform na wszystkich klasach co 10 sekund, więc ich kod bajtowy dostał się w moje Implementacja ClassFileTransformer.Bajtod zmienia się w czasie w nieudokumentowany sposób
Moja implementacja po prostu śledzi zmiany kodu bajtowego klas w czasie. Przede wszystkim zdziwiłem się, że kolejność pól i metod, modyfikatorów dostępu do metod, zawartości puli stałej i innych podobnych rzeczy zmienia się z jednego czeku do drugiego. Ale nadal jest to documented.
Co nie jest udokumentowane - niektóre elementy mogą być tworzone w puli stałej klasy i wstrzykiwane do metod. Na razie zauważyłem, że ma to miejsce z wartościami liczbowymi (Longs, Doubles, Floats i inne).
Tak to wygląda w javap; przed:
pool:
...
#17 Float NaNf
method:
#1 fload #17 //NaNf
...
Po coś zmienił klasę podczas wykonywania:
pool:
...
#17 Float NaNf
#18 Float NaNf
method:
#1 fload #18 //NaNf <- look, it loads #18 now
I podwójne sprawdzone, że żadne inne transformatory lub środki są dołączone.
Dlaczego JVM nie może zostawić mojego kodu bajtowego tak samo? Gdzie mogę przeczytać o takich optymalizacjach/transformacjach (lub co jeszcze jest)? Czytałem źródła JVM, ale te tylko bardziej mnie myliły.
Po prostu próbuję stworzyć swego rodzaju weryfikator kodu bajtowego w czasie rzeczywistym - narzędzie bezpieczeństwa.
Nic nie mówi, że wygenerowany kod musi być deterministyczny, o ile efekt * kodu jest deterministyczny. Nie ulega wątpliwości, że wiele różnic występuje, ponieważ rzeczy mieszają się z różnymi zasobnikami. –
Przykro mi, nie zrozumiałem, co to są wiadra. Jakie masz wiadra? Przy okazji ten kod nie jest generowany. Jest skompilowany, umieszczony w słoikach i pozostaje taki sam przez cały czas. – Oroboros102
Czy masz jakieś transformatory, które zmieniają kod bajtowy? – Antimony