Почему Java не помещает имя файла в аргументы?


20

В C и C ++ метод main хранит имя файла в первой позиции массива в argv [0]. В Java, однако, имя файла не включено в массив строк args.

Есть ли практическая причина для этого? Я понимаю, что это делает перебор аргументов командной строки на основе 0 вместо 1 на основе, но есть ли преимущество? Было ли это имя файла бесполезным?

Ответы:


17

В некоторых случаях программа может запускаться по-разному и демонстрировать различное поведение при ее вызове. Если вы звоните vimкак vi, он работает в режиме совместимости. Иногда стоит попытаться сохранить одну версию нескольких связанных программ - например, mailqи newaliasesво многих системах Unix есть ссылка, чтобы sendmailэти программы оставались синхронизированными)


Java-программы обычно вызываются как:

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

Первая версия, где у вас есть файл манифеста, который указывает основной класс, вторая версия запускает метод main в классе, Fooнайденном в пути к классам.

Информация, представленная для Java, представляет собой либо путь к jar-файлу, либо имя вызываемого класса.

Расположение jar не настолько важно, чтобы можно было что-то кодировать (и на самом деле оно не было частью оригинальной спецификации). Банку можно назвать как угодно, и часто включает номера версий. Более того, нет никакой гарантии, что класс был даже сохранен в .jar (он мог быть извлечен).

Вызов приложения Java с помощью -jarимеет только один способ войти в него - класс, определенный в манифесте. Там нет переименования, которое может быть сделано.

Другой вариант вызова его с именем класса указывает непосредственно на модуль выполнения. Более того, его нельзя назвать умноженным - у вас не может Bar.classбыть кода, потому что class Fooон просто так не работает.

Это должно показать, что на самом деле нет смысла передавать информацию argv[0]в смысле C в Java-приложение - оно будет либо javaбессмысленным, либо произвольным, либо именем вызываемого класса (что вы уже выполняете код из из (вы могли бы сделать что-то вроде, getClass().getEnclosingClass().getName()если бы вы были в отчаянии ...)).

Здесь есть смысл: вы можете определить несколько методов Main в классах в .jar или на пути к классам. И вы могли бы заставить их вести себя по-разному, как если бы был ряд утверждений, основанных на том, что argv[0]было.

В прошлом у меня был код, похожий на тот, java -cp Foo.jar com.me.foo.Testкоторый вызывал Testметод Main класса, а не тот, который определен в методе, определенном в Manifest.


Там должно быть больше, чем это. В C # параметры не содержат имя файла, но приложение обычно выполняется напрямую, просто foo.exe.
svick

@svick Я не знаком ни с C #, ни с тем, как упакован exe-файл. В нескольких ОС вы можете сделать исполняемый файл jar (см. Это ), который запускает точку входа, определенную в манифесте. Подобные вещи могут быть сделаны для C #. Ключевым моментом является то, что вы не можете изменить точку входа, изменив имя файла, и имя файла не предназначено для использования другими частями приложения (за исключением загрузчика классов).

@nqzero ( context ) - если я укажу java com.me.Fooв командной строке метод com.me.Foo.main(String...)вызывается. Обойти это невозможно. И я знаю, что вызывается Foo - нет причин придерживаться этого в argv. Это была бы чисто избыточная информация. Конечно, это может быть в суперклассе, но у меня есть тривиальная возможность перехватить его с желаемой информацией о том, что был вызов командной строки - нет необходимости помещать его в argv.

... и, пожалуйста, не забудьте получить 50 повторений и комментариев, а не предлагать правки в ответ. Это очень плохой способ поднять проблемы с данным постом.

Иногда поведение радикально отличается. Например, wput на самом деле wget.
Маккензм

-4

на самом деле это не приносит никакой пользы, это действительно зависит от синтаксиса языка программирования, который вы используете, если он основан на 0 или 1. переменная (вы называете имя файла) также зависит от языка, она может отличаться в других языках, просто следуйте правильному синтаксису языка, который вы используете.


1
как это отвечает на заданный вопрос?
комнат
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.