Czym jest ASM (kod bajtowy Java)? Wyjaśnienie biblioteki

ASM to biblioteka Java do odczytu i zapisu kodu bajtowego JVM w czasie działania programu. Oto co robi, jak działa i dlaczego mody Minecraft na niej polegają.

Librariesby trqUpdated June 4, 2026
Key takeaways
  • ASM to biblioteka Java do odczytu, modyfikacji i zapisu kodu bajtowego JVM.
  • Działa na skompilowanych plikach .class, dzięki czemu umożliwia przepisanie klasy bez rekompilacji.
  • Modyfikacje (mody) wykorzystują ją do łatania już skompilowanej gry podczas ładowania.
  • Większość twórców modyfikacji używa Mixin, który osiada na warstwie nad ASM i ukrywa szczegóły.

ASM to biblioteka Java do odczytu, modyfikacji i zapisu kodu bajtowego JVM. Działa na skompilowanych plikach .class zamiast kodu źródłowego, dzięki czemu może analizować lub przepisywać klasę bez rekompilacji. Modyfikacje Minecrafta często się na niej opierają, ponieważ pozwala im ona na poprawianie gry podczas ładowania, po tym jak gra została już skompilowana.

Gdzie pasuje Opal

Opal to mod dla Fabric, a mody Fabric sięgają do kodu gry poprzez tę warstwę bajtkodu. Nie musisz jej modyfikować bezpośrednio: silnik skryptów oferuje czysty sposób na rozszerzanie Opal bez pisania bajtkodu.

Co tak naprawdę robi ASM

ASM przekształca skompilowaną klasę w coś, czego program może edytować. Plik .class to po prostu bytecode, czyli instrukcje, które wykonuje Java Virtual Machine. ASM analizuje ten bytecode, udostępnia metody i pola, i pozwala na dodawanie, usuwanie lub modyfikowanie instrukcji. Następnie zapisuje nową, poprawną klasę.

Czysta Java nie potrafi tego zrobić samodzielnie. Kompilator zamienia Twój kod źródłowy na bytecode raz, a po tym bytecode jest ustalony. ASM sięga do bytecode na poziomie, który znajduje się poniżej kodu źródłowego, który normalnie piszesz

Jak to działa

ASM odczytuje klasę za pomocą ClassReader i zapisuje ją za pomocą ClassWriter. Pomiędzy tymi dwoma, Twój kod odwiedza części klasy i decyduje, co zmienić. Istnieją dwie możliwości zrobienia tego.

Podejście oparte na visitorze przetwarza klasę element po elemencie. Jest szybkie i zużywa mało pamięci, ponieważ nigdy nie przechowuje całej klasy w całości. Podejście oparte na drzewie ładuje klasę do obiektów, po których można swobodnie poruszać się i je edytować, co jest łatwiejsze do zrozumienia przy większych zmianach, ale zużywa więcej pamięci.

PodejścieJak działaNajlepsze dla
API VisitoraPrzetwarza zdarzenia klasy w trakcie odczytuMałe, szybkie edycje z małym zużyciem pamięci
API DrzewaBuduje edytowalny model obiektowy klasyWiększe lub bardziej złożone refaktoryzacje

Dlaczego mody do Minecrafta to wykorzystują

Modyfikatorzy muszą zmieniać kod gry, którego nie napisali i nie mogą ponownie skompilować. Gra jest dostarczana jako skompilowane klasy, więc jedyną drogą jest poziom kodu bajtowego, a ASM to właśnie to zapewnia. Mod może wstrzyknąć hak do metody gry, przekierować wywołanie lub dodać pole, wszystko to podczas uruchamiania.

Większość modderów nie wywołuje ASM bezpośrednio. Używają Mixin, frameworku wyższego poziomu, który opiera się na ASM i zamienia proste adnotacje w edycje kodu bajtowego. Piszesz małą klasę Java opisującą zmianę, a framework wykonuje za Ciebie niskopoziomową pracę z ASM. Mody Fabric w szczególności polegają na tym łańcuchu.

Kiedy musiałbyś dotknąć ASM bezpośrednio

Rzadko piszesz surowy ASM jako autor modyfikacji. Pojawia się on, gdy narzędzie potrzebuje większej kontroli niż może wyrazić adnotacja, na przykład ładowacz, obfuskatór lub patcher, który przepisuje klasy w całości. Dla codziennych modyfikacji warstwy adnotacji na górze wystarczają, i są znacznie mniej podatne na błędy.

FAQ