Warum geben wir die filename.class
-Datei nicht nach java
, sondern nur nach filename
?
Angenommen, wir möchten das Programm test.java
kompilieren, dann führen wir javac test.java
aus. Es ist in Ordnung!
Danach wird test.class
file erzeugt, aber um das Programm laufen zu lassen, führen wir java test
anstelle von java test.class
aus. Was ist der Grund dafür?
Weil Sie keine Datei zum Ausführen beschreiben. Sie sagen Java, welche Klasse die Hauptmethode enthält - und der Klassenname ist (in Ihrem Fall) filename
, nicht filename.class
.
Die Tatsache, dass der Bytecode fast immer in Dateien im Dateisystem enthalten ist, ist ein Implementierungsdetail. Der Klassenpfad, den Sie an den Befehl java
übergeben, teilt ihm wo mit, nach Klassen zu suchen, und dann teilt ihm das Hauptklassenargument mit, welche Klasse verwendet werden soll.
(Für javac
ist das anders, weil dieses Programm Quell- Dateien verwendet und sie in Bytecode kompiliert.)
Sie übergeben auch keinen Dateinamen an den java-Befehl. Sie übergeben ihm einen vollständig qualifizierten Klassennamen. So etwas wie com.yourcompany.yourapp.Main
. Java sucht dann nach der .class-Datei für diesen Klassennamen, indem er alle Verzeichnisse und JAR-Dateien im Klassenpfad durchsucht.
Es ist ein Implementierungsdetail. Das Java-Klassenladeprogramm kann um benutzerdefinierten Code erweitert werden, damit es sich anders verhält. Zum Beispiel haben einige Unternehmen verschlüsselte Klassenladeprogramme geschrieben, die in der Lage sind, verschlüsselte Klassendateien im laufenden Betrieb zu entschlüsseln und zu laden. Sie könnten hypothetisch ein ähnliches System erstellen, das eine Reihe von Klassen in etwas zusammenfasst, das einer .NET-Assembly ähnelt, anstatt einer Jar-Datei (die wirklich nur eine Zip-Datei ist).
, wenn Sie " java test.class
"
Sie erhalten entweder
Die Hauptklasse test.class
konnte nicht gefunden oder geladen werden
oder
Ausnahme im Thread "main" java.lang.NoClassDefFoundError: test / class
Dies liegt daran, dass " java
" in " java test.class
" jvm
ist. Es sucht nach der Hauptmethode in der Klasse " class
" anstelle von " test
". Punkt in " java test.class
" hat eine signifikante Bedeutung. So wie jvm
auf " java test.class
" schaut, sucht sie in einem Paket namens " test
" nach einer Java-Klasse namens " class
".
Hoffe das hilft !!
Der Javac Compiler erzeugt eine Datei namens Xyz.class (hier ist Xyz FileName)
das enthält die Byte-Version des Programms
Java Bytecode ist nichts anderes als eine Zwischenrepräsentation Ihres Programms, die Anweisungen enthält, die der Java-Interpreter ausführen wird.
Daher ist die Ausgabe von javac kein Code, der direkt ausgeführt werden kann
Kurz gesagt, das Schlüsselwort javac wird für das Programm Compile the Java verwendet Wenn wir .class mit javac verwenden (Bereits kompilierte Datei .class File) dann Wie kann compile compile bereits kompiliert werden
so gültige Syntax ist: Javac Xyz.java (Kompiliere das Java-Programm) Java Xyz (Führen Sie das Java-Programm aus)
Tags und Links java