2014-03-03 4 views
2

과 함께 읽으면 런타임 중에 컴파일 된 클래스의 컴파일러 정보 (Java 버전 및 32 또는 64 비트)를 가져올 수 있습니까? jar 파일의 명령 줄 내에서 가능하다는 것을 알고 있지만 런타임 중에 가능합니까?런타임 중에 컴파일 된 정보를 Java

해당 정보로 내 응용 프로그램을 시작할 때 로그 항목을 만들려고합니다.

감사 Hauke ​​

+0

"jar 파일의 명령 줄에서"< "- 질문을 편집하고 사용하는 명령과 출력을 표시 할 수 있습니까? – fge

+1

당신의 질문은 컴파일 된 클래스가 32 비트와 64 비트에서 동일하기 때문에 이해가되지 않습니다. 런타임을 결정할 수있는 것은 32 비트 또는 64 비트가 될 수있는 JVM 정보입니다. – eis

답변

2

을 -하지만 유용 할 수 있습니다 : 예를 들어이 옵션을 선택합니다 시작하는 두 개의 부호없는 짧은 정수 :

당신이 생성하는 모든 을 .class 파일에 버전의 스탬프을 포함 0xCAFEBABE 매직 번호 바로 뒤에있는 바이트 오프셋 4.
클래스 형식의 주/부 버전 번호입니다.

public class MyClass { 
    public static void main(String[] args) throws IOException, URISyntaxException { 
     String className = MyClass.class.getName(); 
     String classAsPath = className.replace('.', '/') + ".class"; 
     InputStream stream = MyClass.class.getClassLoader().getResourceAsStream(classAsPath); 
     byte[] buffer = new byte[8]; 
     int r = stream.read(buffer); 
     if (r < 8) { 
      throw new IOException("Something wrong we could read only " + r + " bytes"); 
     } 
     int major = buffer[6]; 
     int minor = buffer[7]; 
     int version = (major << 8); 
     version = version | minor; 
     System.out.printf("Version (major %X, minor %X) -> %X", major, minor, version); 
    } 
} 

은 그럼 당신은 JDK 버전으로 바이트 코드 버전지도 :

  • J2SE 7 = 51 (0x33을 16 진수)
  • J2SE 6.0 = 50 (설정 0x32 16 진수)
  • J2SE 5.0 = 49 (0x31로 회신 진수)
  • JDK 1.4 = 48 (0x30의 16 진수)
  • JDK 1.3 = 47 (0x2F 헥스)
  • JDK 1. 2 = 46 (0x2E 헥스)
  • JDK 1.1 = 45 (0x2D 헥스)는
+2

이것은 컴파일러에 관한 정보가 아니라 바이트 코드 버전만을 제공합니다. – fge

1

컴파일 된 클래스 "는 32 비트 또는 64"이 아니다.

바이트 코드는 같습니다.

관련 문제