Странное поведение с основным методом
У меня есть класс вроде -
public class Test{
public static void main(String[] args){
for(String s: args){
System.out.println(s);
}
}
}
Когда я запускал эту программу как > java Test *
, она печатала имена всех файлов в этой папке.
Я не знаю, проходит ли JVM или windows этот массив вместо '*', я хотел бы знать, ведет ли эта программа к другим платформам (отличным от окон), и почему она ведет себя таким образом? есть ли какая-либо цель или причина для этого?
ПРИМЕЧАНИЕ:
Это не нарушает мой код, но мне просто интересно.
Ответы
Ответ 1
Я изначально думал, что это всего лишь оболочка командной строки, выполняющая расширение имени файла. Это то, что я ожидал бы под Unix-подобной системой, но не с Windows... но то же самое происходит и для меня и под Windows.
Это не происходит, когда я пишу эквивалентный код С#... поэтому я подозреваю, что это что-то в исполняемой программе запуска Java. (Обратите внимание, что javaw.exe ведет себя так же, как java.exe.)
Это, безусловно, стало для меня неожиданностью, и я не думал, что более старые версии Java сделали это в Windows, хотя этот почтовый список с декабря 2000 года предлагает Я не прав. (Я использую OpenJDK 1.7 JRE.)
Я не могу найти никакого описания этого общего случая в документации Java Windows - он упоминает расширение записей в classpath, но не общие аргументы.
Ответ 2
До недавнего времени (я предполагаю, что в Java 6) в Java добавлена новая функция, где '*' переводится ко всем файлам в текущем каталоге. Это было главным образом для того, чтобы избежать необходимости прохождения длинного пути классов и предоставления независимого от платформы способа передачи всех файлов jar в папку в путь к классам.
java -cp "lib/*" <mainClass>
lib/* будет транслироваться в список файлов, разделенных разделителем классов для этой платформы (то есть: для unix like и; для windows), переданных в свойство -cp.
Я думаю, что это может быть причиной поведения, которое вы видите. Я предположил, что это было только для указания классов классов, но теперь я думаю, что я ошибся.
Ответ 3
Я думаю, что командная строка сначала интерпретирует специальные операторы перед передачей в java файл.
например.
java Test * > test.txt
java Test Test.????
java Test ^
Я думаю, что он не специфичен для java.