Wat is het CLASS-bestandsformaat?
Een .class-bestand bevat gecompileerde broncode geschreven in de programmeertaal Java. .class-bestanden worden gegenereerd door de Java-compiler uit .java-bronbestanden die een of meer klassen definiëren. Elk .class-bestand is het resultaat van een succesvolle compilatie en bevat bytecode - een binaire representatie van een klasse die wordt uitgevoerd door de Java Virtual Machine (JVM).
.class-bestanden worden automatisch gegenereerd tijdens de compilatie van .java-bronbestanden. Omdat bytecode platformonafhankelijk is, draait hetzelfde .class-bestand op elk besturingssysteem waarop een compatibele JVM is geïnstalleerd. Een enkel .java-bronbestand kan een of meer klassen bevatten, en elke klasse krijgt zijn eigen .class-bestand tijdens het compilatieproces.
Compilatie van .java-bestanden naar .class-bestanden wordt uitgevoerd met het javac-commando dat is inbegrepen bij de Java Development Kit (JDK). De meeste Java-programmeeromgevingen - inclusief IDE's zoals IntelliJ IDEA en Eclipse - compileren .class-bestanden automatisch terwijl programmeurs code schrijven.
De Java Runtime Environment (JRE) ondersteunt de uitvoering van .class-bestanden via het java-commando, maar staat geen compilatie toe aangezien de JRE de javac-compiler niet bevat.
Elk .class-bestand begint met het 4-byte magic number 0xCAFEBABE, gevolgd door minor- en major-versievelden die de Java-release identificeren die is gebruikt om het te compileren. Meerdere .class-bestanden worden gewoonlijk samen verpakt in een JAR-archief voor distributie en implementatie.
Omdat de JVM beschikbaar is in vele versies, moet men in gedachten houden dat niet alle .class-bestanden compatibel zijn met alle versies van de runtime. Een bestand dat is gecompileerd voor een nieuwere Java-hoofdversie kan niet worden geladen door een oudere JVM.
Beveiliging & veiligheid
RISICO: MEDIUMEen .class is gecompileerde code: als je het uitvoert ('java MyClass') met een JVM, wordt het uitgevoerd met de rechten van je gebruiker, dus een onbekende klasse kan - net als een onbekende JAR of EXE - malware bevatten. Behandel gedownloade gecompileerde Java als onbetrouwbaar: voer alleen klassen uit van een bron die je vertrouwt. Het louter decompileren of disassembleren van een .class (JD-GUI, javap) voert de code niet uit en is veilig. Wees ervan bewust dat bytecode de logica van een programma onthult, dus alles wat je compileert kan door anderen worden gedecompileerd, tenzij het geobfusceerd is.
Formaatdetails
in een notendopProgramma's die CLASS-bestanden openen
Technische details
diepe specificaties| Formaat-type | Gecompileerde Java-bytecode (binair) |
| MIME-type | application/java-vm |
| Magic bytes | 0xCAFEBABE (4 bytes op bestandsoffset 0) - aanwezig in elk geldig .class-bestand |
| Versie-codering | Bytes 6-7 (major version) identificeren de doel-Java-release; bijv. 52 = Java 8, 61 = Java 17, 65 = Java 21 |
| Uitvoeringsomgeving | Java Virtual Machine (JVM) via het `java`-commando |
| Compilatie-tool | `javac`-compiler, inbegrepen in de Java Development Kit (JDK) |
| Platformonafhankelijkheid | Bytecode is CPU-architectuur-neutraal en draait op elk OS met een compatibele JVM |
| Eén klasse per bestand | Elke top-level of statische geneste klasse compileert naar zijn eigen afzonderlijke `.class`-bestand |
| Naamgeving inner classes | Inner en anonieme klassen produceren extra bestanden met `$` in de naam (bijv. `Outer$Inner.class`) |
| Constant pool | Elk bestand bevat een gestructureerde constant pool-tabel met string-literals, klassenamen en veld/methode-descriptors |
| Instructieset | Maakt gebruik van de JVM-bytecode-instructieset (~200 opcodes), onafhankelijk van enige native CPU-instructieset |
| Bytecode-verificator | De JVM verifieert de `.class`-bestandsstructuur en typeveiligheid vóór uitvoering, en weigert misvormde of gemanipuleerde bestanden |
| Decompilatie | Kan worden gedisassembleerd met `javap -c` (JDK ingebouwd) of terug worden gedecompileerd naar Java-broncode met tools zoals JD-GUI of CFR |
| Verpakking | Meestal gedistribueerd gebundeld in `.jar`-archieven (op ZIP gebaseerde containers met meerdere `.class`-bestanden en een manifest) |
| Android-incompatibiliteit | Android voert `.class`-bestanden niet rechtstreeks uit; de `d8`-tool converteert ze naar `.dex`-bytecode voor de Android Runtime (ART) |
| Uitgebracht | 1995-1996 (Java 1.0) |
| Open standaard | Ja · royaltyvrij |
| Specificatie | docs.oracle.com |
CLASS conversies
Community V&A
gevraagd door gebruikersNog geen vragen - wees de eerste om iets te vragen over CLASS-bestanden.