为什么Java不将文件名放在args中?


20

在C和C ++中,main方法将文件名保存在数组的第一个位置argv [0]处。但是,在Java中,文件名不包含在args字符串数组中。

是否有实际原因?我知道这使得通过命令行参数从0开始而不是从1开始进行迭代,但这有好处吗?文件名只是被认为是无用的吗?

Answers:


17

在某些情况下,程序可以以不同的方式运行,并且在调用方式上表现出不同的行为。如果调用vimas vi,它将在兼容模式下运行。有时是尝试维护几个相关程序的一个版本-例如mailqnewaliases在许多Unix系统上,都是链接到sendmail这些程序的,以便这些程序保持同步)


Java程序通常被调用为:

%java -jar foo.jar参数
%Java Foo参数

第一个版本是您具有指示主要类的清单文件的位置,第二个版本Foo在类路径中找到的类中运行main方法。

为Java提供的信息是jar的路径或正在调用的类的名称。

罐子的位置并不重要,不足以作为编写代码的依据(并且实际上并不是原始规范的一部分)。Jar可以用任何名称来命名,并且通常包含版本号。而且,不能保证该类甚至存储在.jar中(可以将其提取出来)。

使用调用Java应用程序-jar只有一种方法可以输入-清单中定义的类。无法重命名。

使用类名调用它的另一种选择是直接指向执行单元。此外,它不能命名为“乘法”-您不能拥有Bar.class它的代码,class Foo否则就无法正常工作。

这应该表明,argv[0]将C 的信息传递给Java应用程序真的没有意义-它要么是java,无意义和任意的,要么是被调用的类的名称(即您已经在执行代码了)的(您可以做一些getClass().getEnclosingClass().getName()绝望的事情...))。

这里有一点,您可以在.jar或类路径中的类中定义多个Main方法。并且您可以让它们的行为有所不同,就像有一系列基于事实的if语句一样argv[0]

过去我有类似的代码来java -cp Foo.jar com.me.foo.Test调用Test类的Main方法,而不是清单中定义的方法。


不仅限于此。在C#中,参数不包含文件名,但通常直接执行应用程序foo.exe
svick

@svick我不熟悉C#,也不了解如何打包exe。在一些OS中,您可以使jar可执行文件(请参阅参考资料),以启动清单中定义的入口点。对于C#,可以完成类似的操作。关键是您不能通过更改文件名来更改入口点,并且文件名不打算由应用程序的任何其他部分使用(在类加载器之外)。

@nqzero(context)-如果我指定java com.me.Foo为命令行,则该方法com.me.Foo.main(String...)正在被调用。没有办法解决。而且我知道正在调用的是Foo-没有理由将其保留在argv中。这将纯粹是冗余信息。当然,它可能在超类中,但是我有一个微不足道的机会用所需的命令行调用信息来拦截它-无需将其放在argv中。

...,请记住要获得50次代表和评论,而不是建议对答案进行修改。这是在给定职位上提出问题的一种非常糟糕的方法。

有时,行为完全不同。例如,wput实际上就是wget。
mckenzm

-4

实际上没有任何好处,它实际上取决于您使用的基于0或1的编程语言的语法。变量(您称为文件名)也取决于语言,在其他语言中,只要遵循所用语言的正确语法,它就可以不同。


1
这如何回答所提问题?
t 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.