Perché Java non inserisce il nome del file in args?

19

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

C'è una ragione pratica per questo? Comprendo che questo rende l'iterazione degli argomenti basati su riga di comando su 0 anziché su base 1, ma c'è un vantaggio? Il nome file è stato ritenuto inutile?

    
posta Jordan L 11.09.2013 - 01:28
fonte

2 risposte

16

In alcuni casi, un programma può essere eseguito in modi diversi e mostrare comportamenti diversi su come viene chiamato. Se chiami vim come vi , viene eseguito in una modalità di compatibilità. A volte è necessario provare a mantenere una versione di diversi programmi correlati - ad esempio mailq e newaliases su molti sistemi unix sono un collegamento a sendmail in modo che questi programmi rimangano sincronizzati)

I programmi Java sono normalmente chiamati 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 Foo trovata nel percorso della classe.

Le informazioni presentate per Java sono o un percorso per il jar o il nome della classe da invocare.

La posizione del barattolo non è abbastanza importante da poter essere codificata da (e in realtà non faceva parte delle specifiche originali). Un Jar può essere chiamato davvero qualcosa e spesso include i numeri di versione. Qualunque cosa sia, non c'è garanzia che la classe sia stata persino memorizzata in una .jar (potrebbe essere stata estratta).

Il richiamo di un'applicazione Java con -jar ha solo un modo per inserirlo: la classe definita nel Manifest. Non è possibile rinominare ciò che è possibile fare.

L'altra opzione, di invocarla con il nome della classe, punta direttamente all'unità di esecuzione. Inoltre, non può essere chiamato multiply - non puoi avere Bar.class essere il codice per class Foo semplicemente non funziona in questo modo.

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

C'è un punto qui, è possibile definire più metodi Main nelle classi in un .jar o sul percorso della classe. E potresti far sì che si comportino in modo diverso, proprio come se esistesse una serie di istruzioni if basate su cosa fosse argv[0] .

In passato ho avuto un codice simile a java -cp Foo.jar com.me.foo.Test che ha invocato il metodo Main della classe Test piuttosto che quello definito in quello definito nel manifest.

    
risposta data 11.09.2013 - 01:56
fonte
-4

in realtà non c'è alcun vantaggio con esso, dipende in realtà dalla sintassi del linguaggio di programmazione che si sta utilizzando se è basato su 0 o su 1. la variabile (a cui fai riferimento come nome file) dipende anche dalla lingua, può essere diversa in altre lingue, basta seguire la sintassi corretta della lingua che stai utilizzando.

    
risposta data 11.09.2013 - 05:55
fonte

Leggi altre domande sui tag