主方法的奇怪行为

时间:2011-03-20 13:55:14

标签: java windows jvm

我有一个类 -

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

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

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

3 个答案:

答案 0 :(得分:15)

我原本以为这只是执行文件名扩展的命令行shell。这就是我在类Unix系统中所期望的,但不是Windows ......但在Windows下也是如此。

当我编写等效的C#代码时不会 ...所以我怀疑它是Java可执行启动程序中的一部分。 (请注意,javaw.exe的行为与java.exe相同。)

我当然感到惊讶,并且我没有认为旧版本的Java在Windows上做到这一点,尽管this mailing list post from December 2000表明我错了。 (我使用的是OpenJDK 1.7 JRE。)

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

答案 1 :(得分:1)

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

java -cp "lib/*" <mainClass>

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

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

答案 2 :(得分:0)

我认为命令行,首先在传递给java文件之前解释特殊操作符。

e.g。

java Test * > test.txt

java Test Test.????
java Test ^

我认为它不是特定于java。