Cosa è ASM (bytecode Java)? Spiegazione della libreria

ASM è una libreria Java per la lettura e la scrittura del bytecode JVM a runtime. Ecco cosa fa, come funziona e perché i mod di Minecraft ne dipendono.

Librariesby trqUpdated June 4, 2026
Key takeaways
  • ASM è una libreria Java per la lettura, la modifica e la scrittura del bytecode JVM.
  • Funziona su file .class compilati, quindi può riscrivere una classe senza ricompilarla.
  • I mod la utilizzano per patchare il gioco già compilato al momento del caricamento.
  • La maggior parte degli sviluppatori di mod utilizza Mixin, che si basa su ASM e nasconde i dettagli.

ASM è una libreria Java per la lettura, la modifica e la scrittura del bytecode JVM. Funziona sui file .class compilati invece del codice sorgente, quindi può ispezionare o riscrivere una classe senza ricompilarla. I mod di Minecraft si basano su di essa perché permette loro di patchare il gioco al momento del caricamento, dopo che il gioco è già stato compilato.

Dove si integra Opal

Opal è un mod Fabric, e i mod Fabric accedono al codice di gioco tramite questo livello di bytecode. Non lo tocchi direttamente: il motore di scripting ti offre un modo pulito per estendere Opal senza scrivere bytecode.

Cosa fa effettivamente ASM

ASM trasforma una classe compilata in qualcosa che un programma può modificare. Un file .class è semplicemente bytecode, le istruzioni che la Java Virtual Machine esegue. ASM analizza questo bytecode, ti consegna i metodi e i campi, e ti permette di aggiungere, rimuovere o modificare le istruzioni. Poi scrive una nuova classe valida.

Il Java semplice non può fare questo da solo. Il compilatore trasforma il tuo codice sorgente in bytecode una volta, e dopo di che il bytecode è fisso. ASM interviene a livello di bytecode, che è lo strato al di sotto del codice sorgente che normalmente scrivi

Come funziona

ASM legge una classe con un ClassReader e ne scrive una con un ClassWriter. Tra i due, il tuo codice visita le parti della classe e decide cosa modificare. Ci sono due modi per farlo.

L'approccio visitor scorre la classe elemento per elemento. È veloce e utilizza poca memoria perché non mantiene mai l'intera classe in memoria. L'approccio ad albero carica la classe in oggetti che puoi percorrere e modificare liberamente, il che è più facile da comprendere per modifiche più grandi, ma utilizza più memoria.

ApproccioCome funzionaIdeale per
API VisitorTrasmette gli eventi della classe durante la letturaModifiche piccole e veloci con poca memoria
API ad alberoCostruisce un modello di oggetto modificabile della classeRiscritture più grandi o complesse

Per quale motivo i mod di Minecraft lo usano

I modder devono modificare il codice di gioco che non hanno scritto e non possono ricompilare. Il gioco viene distribuito come classi compilate, quindi l'unico modo per intervenire è a livello di bytecode, ed è qui che ASM entra in gioco. Un mod può iniettare un hook in un metodo di gioco, reindirizzare una chiamata o aggiungere un campo, il tutto all'avvio.

La maggior parte dei modder non chiama ASM direttamente. Utilizzano Mixin, un framework di livello superiore che si basa su ASM e trasforma semplici annotazioni nelle modifiche al bytecode sottostanti. Si scrive una piccola classe Java che descrive la modifica, e il framework si occupa del lavoro di basso livello con ASM. I mod Fabric in particolare si basano su questa catena.

Quando si dovrebbe toccare ASM direttamente

Raramente si scrive ASM raw come autore di mod. Si presenta quando uno strumento ha bisogno di più controllo di quanto possa esprimere un'annotazione, come un loader, un offuscator o un patcher che riscrive interamente le classi. Per i mod di tutti i giorni, lo strato di annotazioni sopra è sufficiente, ed è molto meno soggetto a errori.

FAQ