使用主方法的奇怪行为

2022-09-01 23:45:33

我有一个类像 -

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

当我像>一样运行此程序时,它会打印该文件夹中所有文件的名称。
我不知道JVM还是Windows传递这个数组而不是' * ',我想知道这个程序在其他平台(Windows除外)上的行为是否相同,为什么它以这种方式运行?这有什么目的或原因吗?java Test *

注意
它不会破坏我的任何代码,但我只是好奇。


答案 1

我最初以为这只是执行文件名扩展的命令行shell。这是我在类Unix系统下所期望的,但不是Windows......但是在Windows下,我也发生了同样的事情。

当我编写等效的C#代码时,它不会发生...所以我怀疑这是Java可执行启动器中的东西。(请注意,javaw.exe的行为方式与java.exe相同。

这对我来说肯定是一个惊喜,我不认为旧版本的Java在Windows上可以做到这一点,尽管2000年12月的这个邮件列表帖子表明我错了。(我使用的是 OpenJDK 1.7 JRE。

我在Java Windows文档中找不到有关此一般情况的任何描述 - 它提到了类路径条目的扩展,但没有提到一般参数。


答案 2

直到最近(我猜在Java 6中)才在Java中添加了一个新功能,其中“*”被转换为当前目录中的所有文件。这主要是为了避免需要传递长类路径,并给出一种独立于平台的方式将文件夹中的所有jar文件传递到类路径。

java -cp "lib/*" <mainClass>

lib/* 将被转换为由该平台的类路径分隔符分隔的文件列表(即:对于unix like和;对于windows),传递给-cp属性。

我认为这可能是你看到的行为的原因。我以为它只是为了指定类路径,但现在我认为我当时错了。


推荐