반응형

Class 파일의 버젼을 알아보는 방법에 대해 공부해 보도록 하겠다.
가끔 배치작업 또는 모듈제공등의 업무를 회사에서 할때에 이러한 케이스를 별도로 알아두고
작업하는것이 편하다.

예전에 보고 안봐서 잠시 까먹었었는데 이번기회에 제대로 정리를 해보도록 하겠다.

[서론]
java file -> class 파일의 확장자로 변경하게 되면 compiler가 compile이란 과정을 거치게 된다.
이떄 class file앞에 헤더를 붙이게 되는데 우리가 육안으로 알아보기 힘든 binary데이터와 hex데이터의  조합으로 이것저것 뒤섞여 버린다.이런놈의 버젼을 알아보는 방법에 대해 알아보도록 하자

[ 본론 ]
우선 아래 코드를 참조하자. developer들이 개발을 할때에 major한 부분을 개발하는 사람이 있고 minor한 버젼의 서브 프로젝트를 할떄가 있다. 따라서 하나의 배포판은 major버젼과 minor버젼의 합이라고 할수 있다. jdk 를 만드는 프로젝트 역시 sun사에서 2개로 나누어서 개발을 한다. 그 개발배포 버젼정보는 아래와 같다.

major  minor     version
45         3           1.0
45         3           1.1
46         0           1.2
47         0           1.3
48         0           1.4
49         0           1.5
50         0           1.6


위의 값은 버젼별로 major와 minor 버젼까지 알려준다.

그럼 class 파일을 하나 까보도록 하자 . hex 로 view를 해줄수 있는 울트라 에디터와 같은 좋은 툴이 있다면 class를 까볼수 있다.

해당 .class파일을 에디터로 열어보면 맨앞줄의 헤더정보는 아래와 같다.

0000000h : CA FE BA BE 00 00 00 30 00 BC 07 ~~~~

위 정보중에서 우리가 알아야 할정보는 영어 뒤에 값이다. HEX 값이기 때문에 저걸 10진수로 바꾸면
기본 헤더정보인 CA FE BA BE 뒤에 버젼정보가 온다는것을 알수가 있다.

00 00 | 00 30 이다. 마지막에 오는 30이 바로 version정보이다. 30은 hex코드이기 때문에 이것을 10진수로 변환하면 48이 된다. 이 48은 major 버젼의 정보가 되어 해당 파일은 1.4로 컴파일된 .class 파일인것을 알수 있다.

참조로 아래 표를 보자

00 00 | 00 30
minor   major  정보이다.

앞에 minor은 0이 되고 뒤에 major은 30을 10진수로 바꾼 48이 된다.

따라서 저놈은 버젼이 1.4인 것이다. 끝!!ㅋㅋㅋ

저걸 일일이 열어보려면 좀 짱난다.

아래 소스는 컴파일된 정보를 알아볼수 있도록 한 java 소스이다.

 import java.io.*;

public class ClassVersionChecker {
    public static void main(String[] args) throws IOException {
        for (int i = 0; i < args.length; i++)
            checkClassVersion(args[i]);
    }

    private static void checkClassVersion(String filename)
        throws IOException
    {
        DataInputStream in = new DataInputStream
         (new FileInputStream(filename));

        int magic = in.readInt();
        if(magic != 0xcafebabe) {
          System.out.println(filename + " is not a valid class!");;
        }
        int minor = in.readUnsignedShort();
        int major = in.readUnsignedShort();
        System.out.println(filename + ": " + major + " . " + minor);
        in.close();
    }
}




해당 소스를 보면 별거 없다. ㅋㅋ

실행하면 아래와 같은 결과가 나온다.

 > java ClassVersionChecker ClassVersionChecker.class
ClassVersionChecker.class: 49 . 0


이렇게 class 파일에 대한 정보를 알아 보는 방법에 대해서 몇자 끄적대보았다.

참조한 사이트 : http://www.rgagnon.com/javadetails/java-0544.html

이제 나이도 있는데

영어로 번역된 사이트를 참조하도록 하자. ㅋ

반응형

'Program > JAVA' 카테고리의 다른 글

JAVA - LINUX 명령어 실행하는 방법  (0) 2010.02.06
자바 메일 강의자료 Sendmail  (0) 2010.01.27
String Class 사용시 주의사항  (2) 2010.01.21
자바 특별한 Exception  (0) 2010.01.11
메모리 릭에 대해 글쓰는중 ver1  (0) 2009.11.13

+ Recent posts