15 Nisan 2015 Çarşamba

Java .class dosyası


JVM specification'da bir .class dosyasının yapısı şöyle tanımlanmıştır:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ClassFile {
    u4 magic;
    u2 minor_version;
    u2 major_version;
    u2 constant_pool_count;
    cp_info constant_pool[constant_pool_count-1];
    u2 access_flags;
    u2 this_class;
    u2 super_class;
    u2 interfaces_count;
    u2 interfaces[interfaces_count];
    u2 fields_count;
    field_info fields[fields_count];
    u2 methods_count;
    method_info methods[methods_count];
    u2 attributes_count;
    attribute_info attributes[attributes_count];}
Bir .class dosyasını hex editörde açtığımızda uzun bir byte sıralaması görürüz:
ca fe ba be 00 00 00 34 00 28 07 00 02 01 00 1b ...

Bunları sırayla inceleyelim.

1. magic: (4 byte)
Bir java class dosyası daima 0xCAFEBABE ile başlar. 
Diğer bir deyişle bir dosyanın ilk 4 byte'ı 0xCAFEBABE ise o bir java class dosyasıdır diyebiliriz.
Diğerlerinden ayırt etmek amacıyla konmuştur.

2. minor_version, major_version: (2+2=4 byte)
İlk 4 byte'tan sonraki 4 byte da class versiyonunu belirtir.
Örneğin bu değer 0x00000034 ise, versiyon 52.0 demektir. Yani JDK 1.8 ile derlenmiş.
JDK 1.6 ile derlendiyse versiyonu 50.0, JDK 1.5 ile derlendiyse 49.0 demektir.
Eğer bir class kendinden düşük seviyede JVM ile çalıştırılırsa java.lang.UnsupportedClassVersion hatası ortaya çıkar.

3. constant_pool_count, constant_pool[]:
Versiyondan sonra yani 8.byte'tan sonra, constant pool bilgisi bulunur.
Runtime Constant Pool alanında bu bilgi kullanılır.
Değeri 0x0028 ise, constant_pool'da 40-1=39 index var demektir.

4. access_flags:
Classın modifier bilgisi burada bulunur.
Yani classın public, final, abstract ya da interface olup olmadığını belirtir.

5. this_class, super_class:
constant_pool'da bu classa ve super classına denk gelen indexler.

6. interfaces_count, interfaces[]:
bu classın implement ettiği interface sayısı ve bu interface'lerin kendisini gösteren constant_pool indexleri.

7. fields_count, fields[]:
bu classın field sayısı ve field bilgisi (adı, tipi, modifier'ı ve constant_pool indexi).

8. methods_count, methods[]:
Classtaki metod sayısı ve metod bilgisi (adı, parametre sayısı ve tipleri, return tipi, modifier'ı, constant_pool indexi, metodun uygulama kodu ve exception bilgisi).

9. attributes_count, attributes[]:
field_info ve method_info 'da attribute_info yapısı kullanılır.
attribute_info yapısında çeşitli attribute'ler bulunur.


javap -verbose opsiyonuyla Java assembly formatını incelersek,
...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Compiled from "UserService.java"
 
public class com.nhn.service.UserService extends java.lang.Object
  SourceFile: "UserService.java"
  minor version: 0
  major version: 50
  Constant pool:const #1 class        #2;     //  com/nhn/service/UserService
const #2 = Asciz        com/nhn/service/UserService;
const #3 class        #4;     //  java/lang/Object
const #4 = Asciz        java/lang/Object;
const #5 = Asciz        admin;
const #6 = Asciz        Lcom/nhn/user/UserAdmin;;// … omitted - constant pool continued …
 
{
// … omitted - method information …
 
public void add(java.lang.String);
  Code:
   Stack=2, Locals=2, Args_size=2
   0:   aload_0
   1:   getfield        #15//Field admin:Lcom/nhn/user/UserAdmin;
   4:   aload_1
   5:   invokevirtual   #23//Method com/nhn/user/UserAdmin.addUser:(Ljava/lang/String;)Lcom/nhn/user/User;
   8:   pop
   9:   return  LineNumberTable:
   line 140
   line 159  LocalVariableTable:
   Start  Length  Slot  Name   Signature
   0      10      0    this       Lcom/nhn/service/UserService;
   0      10      1    userName       Ljava/lang/String; // … Omitted - Other method information …
}
...


Hiç yorum yok:

Yorum Gönder