2012-01-12 3 views
0

프로그램에서 두 개의 외부 jar 라이브러리를 사용하고 있습니다. 외부 라이브러리 X에있는 클래스가 라이브러리의 클래스 m을 호출하는 클래스입니다. 라이브러리 X은 라이브러리 Y의 버전 1.0으로 컴파일되었습니다. 그러나, 내 코드에서 다른 목적으로 라이브러리 Y을 사용하고 있으므로, 마지막 버전을 사용하는 것을 선호합니다 (5.0이라고 가정 해보십시오). 제 문제는 코드를 실행할 때 라이브러리 X이 더 이상 (NoSuchMethod 오류를 던지는) m 메서드가 없다는 것에 불평합니다. 그러나 그 방법이 있습니다.NoSuchMethod 오류가 최신 버전의 JAR 파일을 사용하려고합니다

이 문제는 컴파일 시간에 제공된 라이브러리보다 새로운 버전의 Y을 사용하고 있다는 사실과 관련이있을 수 있습니까? (역방향 호환이 가능하지만 다른 바이트 코드가 있더라도?). 그렇다면 Java 메소드 호출이 기호 참조 (예 : 메소드 서명)로 표시되고 직접 참조 (예 : 오프셋)가 아닌 바이트 코드로 표시되었다고 생각하기 때문에 의아해 할 것입니다. 그러나 오해가있을 수 있습니다. 어떤 것.

설명해 주셔서 감사합니다.

답변

3

[...] I 자바 메소드 호출은 바이트 코드와 같은 심볼의 참조 (예를 들어, 메소드 서명)에서 표현되지 알았는데 직접 참조 (예를 들면, 오프셋들) [...]

로서

당신은 올바르게 생각했습니다. 그러나 Y v5.0의 메소드는 Y v1.0의 메소드와 다른 서명을 가질 수 있습니다 (동일한 이름을 가지고 있더라도). 예를 들어 다른 수의 인수 또는 다른 유형의 인수가 있거나 static 또는 static이 될 수 있습니다.

+0

실제로. 서명이 매우 미묘하게 바뀌 었습니다. 원래 버전의 메소드는 매개 변수로 'int'를 가지며 새 버전에서는 'long'입니다. 필자는 '호환 가능한'방법이 여전히 존재한다는 것을 확인하는 것일뿐, '정확한'방법이 아직 존재하지 않는다는 것을 깨닫지 못했다. 감사. – Sergio

+0

@ 수르지 오 : 천만에요. 컴파일러가 자동으로 처리하는 것들, 즉 명백한 JVM 지원없이 암시적인 변환 변환, 공변 반환 등을 간과하는 것은 쉽습니다. – ruakh

1

방법 X 여전히 항아리 Y에 존재할 수 있지만, 아마도 방법 서명이 변경 호출 것을 이름 - 즉, 번호 또는 인수의 유형이 변경되었을 수 있습니다.

관련 문제