기본 콘텐츠로 건너뛰기

[ JAVA ] JDK 버전과 컴파일된 .class 파일의 버전 연관성

ByteCode 로 Instrumenation을 하던 중에 컴파일된 .class 파일을 통해서 사용된 JDK 의 버전을 찾아야 하는 상황이 발생했다. 여러 가지 방법을 찾던 중에 알게된 내용이 있어서 정리해 놓는다.

.class 파일의 버전을 얻는 방법은 다음과 같다.

> Unix/Linux 환경인 경우
javap -verbose MyClass | grep "major"
> Windows 환경인 경우
javap -verbose MyClass | findstr "major"

위의 명령은 .class 에 설정되어 있는 메타 정보들 중에서 "major" 버전 정보를 읽은 것이다. 이 명령의 결과로 다음과 같이 정리할 수 있다.

  • Java 1.2 를 사용한 경우에 Major 버전은 46
  • Java 1.3 을 사용한 경우에 Major 버전은 47
  • Java 1.4 를 사용한 경우에 Major 버전은 48
  • Java 5 를 사용한 경우에 Major 버전은 49
  • Java 6 을 사용한 경우에 Major 버전은 50
  • Java 7 을 사용한 경우에 Major 버전은 51
  • Java 8 을 사용한 경우에 Major 버전은 52

이 버전에 따라서 ClassWriter의 Verify 방법이 달라지게 된다. 따라서 Java 7 이전에 컴파일된 jar를 포함하여 사용하는 경우에 ByteCode 로 Instrumentation을 하는 경우라면 여러 가지 오류들 (Expand_Frames 옵션이 필요하다거나 ClassNotFoundException 등) 피하기 위해서 동적으로 운영할 수 있어야 한다.

ByteCode Instrumentation (Using ASM) 을 할 경우에 해당 버전 정보를 대상 클래스에서 찾기 위해서는 아래의 명령을 사용하면 된다.
ClassReader cr = new ClassReader(classFileBuffer);
int majorVersion = cr.readUnsignedShort(6);





댓글