Perché Java non inserisce il nome file in args?


20

In C e C ++, il metodo principale mantiene il nome file nella prima posizione dell'array su argv [0]. In Java, tuttavia, il nome file non è incluso nell'array string args.

C'è una ragione pratica per questo? Comprendo che ciò rende iterando gli argomenti della riga di comando in base 0 anziché 1, ma c'è un vantaggio? Il nome del file è stato considerato inutile?

Risposte:


17

In alcuni casi, un programma può essere eseguito in modi diversi ed esibire comportamenti diversi su come viene chiamato. Se chiami vimcome vi, viene eseguito in una modalità di compatibilità. A volte è per cercare di mantenere una versione di diversi programmi correlati - ad esempio mailqe newaliasessu molti sistemi unix sono un link per sendmailmantenere sincronizzati questi programmi)


I programmi Java sono in genere invocati come:

% java -jar foo.jar args
% java Foo args

La prima versione è dove hai un file Manifest che indica la classe principale, la seconda versione esegue il metodo principale nella classe Footrovata nel percorso della classe.

Le informazioni presentate per Java sono un percorso del jar o il nome della classe che viene invocata.

La posizione del vaso non è abbastanza importante per essere qualcosa da cui codificare (e in realtà non faceva parte delle specifiche originali). Un Jar può essere chiamato con qualsiasi nome, e spesso include numeri di versione. Inoltre, non vi è alcuna garanzia che la classe sia stata persino memorizzata in un .jar (avrebbe potuto essere estratto).

Richiamare un'applicazione Java con -jarha solo un modo per accedervi: la classe definita nel Manifest. Non è possibile rinominare.

L'altra opzione, di invocarlo con il nome della classe, punta direttamente all'unità di esecuzione. Inoltre, non può essere chiamato moltiplicare - non puoi Bar.classessere il codice class Fooperché semplicemente non funziona in questo modo.

Questo dovrebbe mostrare che non ha davvero senso passare le informazioni argv[0]in senso C a un'applicazione Java - o sarà java, senza senso e arbitrario, o il nome della classe che viene invocata (che stai già eseguendo il codice di (potresti fare qualcosa come getClass().getEnclosingClass().getName()se fossi disperato ...)).

C'è un punto qui, è possibile definire più metodi principali nelle classi in un .jar o nel percorso della classe. E potresti farli comportare diversamente come se ci fosse una serie di istruzioni if ​​basate su ciò che argv[0]era.

In passato ho avuto un codice simile a quello java -cp Foo.jar com.me.foo.Testche invocava il Testmetodo Main della classe piuttosto che quello definito in quello definito nel Manifest.


Deve esserci di più. In C #, i parametri non contengono il nome del file, ma l'applicazione viene di solito eseguita direttamente, solo foo.exe.
svick,

@svick Non ho familiarità con C #, né come viene confezionato un exe. In alcuni sistemi operativi è possibile creare un eseguibile jar (vedere questo ) che avvia il punto di ingresso definito nel Manifest. Cose simili possono essere fatte per C #. La cosa fondamentale è che non è possibile cambiare il punto di ingresso cambiando il nome del file e il nome del file non è destinato a essere utilizzato da altre parti dell'applicazione (al di fuori del caricatore di classi).

@nqzero ( contesto ) - Se si specifica java com.me.Foocome riga di comando, com.me.Foo.main(String...)viene invocato il metodo . Non c'è modo di aggirare questo. E so che è Foo che viene invocato - non c'è motivo di attaccarlo in argv. Sarebbe un'informazione puramente ridondante. Certo, potrebbe essere nella superclasse, ma ho la banale opportunità di intercettarlo con le informazioni desiderate su ciò che era l'invocazione della riga di comando - non c'è bisogno di metterlo in argv.

... e ricorda di ottenere 50 rappresentanti e commenti piuttosto che suggerire modifiche alla risposta. È un modo molto scarso di sollevare problemi con un determinato post.

A volte il comportamento è radicalmente diverso. wput per esempio è in realtà wget.
mckenzm,

-4

in realtà non ha alcun vantaggio, dipende davvero dalla sintassi del linguaggio di programmazione che stai usando se è basato su 0 o 1. la variabile (denominata nome file) dipende anche dalla lingua, può essere diversa in altre lingue basta seguire la sintassi corretta della lingua che si sta utilizzando.


1
come risponde alla domanda posta?
moscerino
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.