기본 콘텐츠로 건너뛰기

라벨이 .class Version인 게시물 표시

[ 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.rea