Подтвердить что ты не робот

Странное поведение с основным методом

У меня есть класс вроде -

public class Test{
    public static void main(String[] args){
        for(String s: args){
            System.out.println(s);
        }
    }
}

Когда я запускал эту программу как > java Test *, она печатала имена всех файлов в этой папке.
Я не знаю, проходит ли JVM или windows этот массив вместо '*', я хотел бы знать, ведет ли эта программа к другим платформам (отличным от окон), и почему она ведет себя таким образом? есть ли какая-либо цель или причина для этого?

ПРИМЕЧАНИЕ:
Это не нарушает мой код, но мне просто интересно.

4b9b3361

Ответ 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.