In einigen Fällen kann ein Programm auf unterschiedliche Weise ausgeführt werden und ein unterschiedliches Verhalten beim Aufruf zeigen. Wenn Sie vim
as aufrufen vi
, wird es in einem Kompatibilitätsmodus ausgeführt. Manchmal muss versucht werden, eine Version mehrerer verwandter Programme zu verwalten - zum Beispiel mailq
und newaliases
auf vielen Unix-Systemen ist dies eine Verknüpfung, sendmail
damit diese Programme synchron bleiben.
Java-Programme werden normalerweise wie folgt aufgerufen:
% java -jar foo.jar args
% java Foo args
In der ersten Version verfügen Sie über eine Manifest-Datei, die die Hauptklasse angibt. In der zweiten Version wird die Hauptmethode in der Klasse ausgeführt, die Foo
sich im Klassenpfad befindet.
Die für Java angezeigten Informationen sind entweder ein Pfad zum Jar oder der Name der aufgerufenen Klasse.
Die Position des Glases ist nicht wichtig genug, um Code zu verwenden (und war eigentlich nicht Teil der ursprünglichen Spezifikation). Ein Jar kann wirklich einen beliebigen Namen haben und enthält häufig Versionsnummern. Darüber hinaus gibt es keine Garantie dafür, dass die Klasse sogar in einer .jar-Datei gespeichert wurde (sie hätte extrahiert werden können).
Das Aufrufen einer Java-Anwendung mit -jar
hat nur eine Möglichkeit, sie aufzurufen - die im Manifest definierte Klasse. Es kann nicht umbenannt werden.
Die andere Möglichkeit, es mit dem Klassennamen aufzurufen, zeigt direkt auf die Ausführungseinheit. Darüber hinaus kann es nicht mehrfach benannt werden - Sie können nicht Bar.class
den Code dafür haben , der class Foo
einfach nicht so funktioniert.
Dies sollte zeigen, dass es wirklich keinen Sinn macht, die Informationen von argv[0]
C an eine Java-Anwendung weiterzugeben - sie sind entweder java
bedeutungslos und willkürlich oder der Name der Klasse, die aufgerufen wird (Sie führen bereits Code aus) von (Sie könnten so etwas tun, getClass().getEnclosingClass().getName()
wenn Sie verzweifelt wären ...)).
Hier gibt es einen Punkt, an dem Sie mehrere Main-Methoden in Klassen in einer .jar-Datei oder im Klassenpfad definieren können. Und man könnte sie sich anders verhalten lassen, als gäbe es eine Reihe von if-Anweisungen, die darauf basieren, was argv[0]
war.
Ich hatte in der Vergangenheit einen ähnlichen Code, java -cp Foo.jar com.me.foo.Test
der die Test
Main-Methode der Klasse aufrief und nicht die, die in der im Manifest definierten Methode definiert ist.
foo.exe
.java com.me.Foo
als Befehlszeile angebe , wird die Methodecom.me.Foo.main(String...)
aufgerufen. Daran führt kein Weg vorbei. Und ich weiß, dass es Foo ist, der angerufen wird - es gibt keinen Grund, dies in argument zu verankern. Es wäre eine rein redundante Information. Sicher, es könnte in der Oberklasse sein, aber ich habe die triviale Möglichkeit, es mit den gewünschten Informationen darüber abzufangen, was der Befehlszeilenaufruf war - keine Notwendigkeit, es in argv zu setzen.Eigentlich hat es keinen Vorteil, es hängt wirklich von der Syntax der verwendeten Programmiersprache ab, ob sie 0-basiert oder 1-basiert ist. Die Variable (Sie bezeichnen sie als Dateiname) hängt auch von der Sprache ab. Sie kann in anderen Sprachen unterschiedlich sein. Befolgen Sie einfach die korrekte Syntax der von Ihnen verwendeten Sprache.
quelle