답변:
어떤 경우에는 프로그램이 다른 방식으로 실행될 수 있으며 프로그램이 호출되는 방식에 따라 다른 동작을 보일 수 있습니다. 당신이 호출하는 경우 vim
와 같은 vi
, 그것은 호환성 모드에서 실행됩니다. - 예를 들어, 때때로 여러 관련 프로그램의 한 버전을 유지하는 것입니다 mailq
및 newaliases
많은 유닉스 시스템에있는 링크를에 sendmail
있으므로 이러한 프로그램이 동기화) 남아 있음
Java 프로그램은 일반적으로 다음과 같이 호출됩니다.
% java -jar foo.jar 인수 % 자바 푸 인수
첫 번째 버전은 기본 클래스를 나타내는 매니페스트 파일이있는 곳이고 두 번째 버전은 Foo
클래스 경로에서 찾은 클래스 에서 기본 메소드를 실행합니다 .
Java에 제공되는 정보는 jar의 경로 또는 호출중인 클래스의 이름입니다.
항아리의 위치는 코딩 할 무언가가 될만큼 중요하지 않으며 실제로 원래 사양의 일부가 아닙니다. Jar는 실제로 이름을 지정할 수 있으며 종종 버전 번호를 포함합니다. 또한 클래스가 .jar에 저장되었다고 보장 할 수 없습니다 (추출 가능).
Java 응용 프로그램을 호출하면 한 -jar
가지 방법 만 입력 할 수 있습니다. 매니페스트에 정의 된 클래스입니다. 수행 할 수있는 이름 변경이 없습니다.
클래스 이름으로 호출하는 다른 옵션은 실행 단위를 직접 가리 킵니다. 또한 곱하기라는 이름을 지정할 수 없습니다 Bar.class
. 코드 class Foo
가 그렇게 작동하지 않을 수는 없습니다.
이것은 argv[0]
C 의미 의 정보를 Java 응용 프로그램 에 전달할 필요가 없다는 것을 보여 주어야합니다 - java
의미가없고 임의적이거나 호출중인 클래스의 이름입니다 (이미 코드를 실행하고 있음) (당신 getClass().getEnclosingClass().getName()
이 필사적 인 경우 와 같은 것을 할 수 있습니다 ...)).
여기에 요점이 있습니다. .jar 또는 클래스 경로의 클래스에서 여러 Main 메소드를 정의 할 수 있습니다. 그리고 무엇 argv[0]
을 기반으로 일련의 if 문이있는 것처럼 다르게 동작하도록 할 수 있습니다 .
과거에는 매니페스트에 정의 된 메소드가 아닌 클래스의 Main 메소드 java -cp Foo.jar com.me.foo.Test
를 호출 한 코드와 유사합니다 Test
.
java com.me.Foo
명령 줄로 지정 하면 메서드 com.me.Foo.main(String...)
가 호출됩니다. 그 주위에 방법이 없습니다. 그리고 나는 그것이 호출되는 것이 Foo라는 것을 알고 있습니다-argv에 그것을 넣을 이유가 없습니다. 순수한 정보 일 것입니다. 물론, 그것은 수퍼 클래스에있을 수 있지만, 명령 행 호출이 무엇인지에 대한 원하는 정보를 가로 챌 수있는 사소한 기회가 있습니다. argv에 넣을 필요는 없습니다.
실제로는 아무런 이점이 없으며, 0 기반 또는 1 기반의 경우 사용하는 프로그래밍 언어의 구문에 따라 다릅니다. 변수 (파일 이름이라고도 함)는 언어에 따라 다르며 다른 언어에서는 사용중인 언어의 올바른 구문을 따라 다를 수 있습니다.
foo.exe
.