Java가 파일 이름을 인수로 넣지 않는 이유는 무엇입니까?


20

C 및 C ++에서 기본 메소드는 argv [0]에서 배열의 첫 번째 위치에 파일 이름을 보유합니다. 그러나 Java에서는 파일 이름이 args 문자열 배열에 포함되지 않습니다.

이에 대한 실질적인 이유가 있습니까? 이것이 명령 줄 인수를 1 기반이 아닌 0 기반으로 반복한다는 것을 이해하지만 이점이 있습니까? 파일 이름이 쓸모없는 것으로 간주 되었습니까?

답변:


17

어떤 경우에는 프로그램이 다른 방식으로 실행될 수 있으며 프로그램이 호출되는 방식에 따라 다른 동작을 보일 수 있습니다. 당신이 호출하는 경우 vim와 같은 vi, 그것은 호환성 모드에서 실행됩니다. - 예를 들어, 때때로 여러 관련 프로그램의 한 버전을 유지하는 것입니다 mailqnewaliases많은 유닉스 시스템에있는 링크를에 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.


그것보다 더 많은 것이 있어야합니다. C #에서 매개 변수는 파일 이름을 포함하지 않지만 응용 프로그램은 일반적으로 바로 실행됩니다 foo.exe.
svick September

@svick 나는 C #에 익숙하지 않으며 exe가 어떻게 패키지되어 있는지 잘 모른다. 일부 OS 에서는 매니페스트에 정의 된 진입 점을 시작 하는 jar 실행 파일 ( this 참조 )을 만들 수 있습니다 . C #에서도 비슷한 작업을 수행 할 수 있습니다. 중요한 것은 파일 이름을 변경하여 진입 점을 변경할 수 없으며 파일 이름은 응용 프로그램의 다른 부분 (클래스 로더 외부)에서 사용되지 않습니다.

@nqzero ( context )- java com.me.Foo명령 줄로 지정 하면 메서드 com.me.Foo.main(String...)가 호출됩니다. 그 주위에 방법이 없습니다. 그리고 나는 그것이 호출되는 것이 Foo라는 것을 알고 있습니다-argv에 그것을 넣을 이유가 없습니다. 순수한 정보 일 것입니다. 물론, 그것은 수퍼 클래스에있을 수 있지만, 명령 행 호출이 무엇인지에 대한 원하는 정보를 가로 챌 수있는 사소한 기회가 있습니다. argv에 넣을 필요는 없습니다.

... 답변에 대한 수정을 제안하기보다는 50 명의 담당자와 의견을받는 것을 잊지 마십시오. 특정 게시물에 대한 문제를 제기하는 것은 매우 나쁜 방법입니다.

때로는 행동이 근본적으로 다릅니다. 예를 들어 wput은 실제로 wget입니다.
mckenzm

-4

실제로는 아무런 이점이 없으며, 0 기반 또는 1 기반의 경우 사용하는 프로그래밍 언어의 구문에 따라 다릅니다. 변수 (파일 이름이라고도 함)는 언어에 따라 다르며 다른 언어에서는 사용중인 언어의 올바른 구문을 따라 다를 수 있습니다.


1
이것은 질문에 어떻게 대답합니까?
gnat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.