Ich habe die folgende Java-Klasse
public class HelloWorld {
public static void main(String []args) {
}
}
Wenn ich diese Datei kompiliere und ein sha256 für die resultierende Klassendatei ausführe, erhalte ich
9c8d09e27ea78319ddb85fcf4f8085aa7762b0ab36dc5ba5fd000dccb63960ff HelloWorld.class
Als nächstes habe ich die Klasse geändert und eine leere Zeile wie folgt hinzugefügt:
public class HelloWorld {
public static void main(String []args) {
}
}
Wieder lief ich einen sha256 auf dem Ausgang und erwartete das gleiche Ergebnis, aber stattdessen bekam ich
11f7ad3ad03eb9e0bb7bfa3b97bbe0f17d31194d8d92cc683cfbd7852e2d189f HelloWorld.class
Ich habe diesen TutorialsPoint-Artikel gelesen dass:
Eine Zeile, die nur Leerzeichen enthält, möglicherweise mit einem Kommentar, wird als Leerzeile bezeichnet, und Java ignoriert sie vollständig.
Meine Frage ist also, da Java leere Zeilen ignoriert, warum unterscheidet sich der kompilierte Bytecode für beide Programme?
Der Unterschied in HelloWorld.class
einem 0x03
Byte wird nämlich durch ein 0x04
Byte ersetzt.
Set
s intern mit Randomisierung verwendet, kann dies bei jedem Lauf zu einer anderen Reihenfolge führen. Es kann auch ein benutzerdefiniertes Attribut hinzugefügt werden, das die Kompilierungszeit enthält. Und so weiter ...