Τι είναι ένα αρχείο Class;
Ένα αρχείο κλάσης σε Java είναι η μεταγλωττισμένη έξοδος της κλάσης .java που στην πραγματικότητα εκτελείται από μια εικονική μηχανή Java (JVM). Τα αρχεία κλάσης μπορούν να εκτελεστούν μεμονωμένα καθώς και μπορούν να αποτελούν μέρος ενός αρχείου JAR ως πακέτο μαζί με άλλα αρχεία πακέτων. Αυτά μπορούν να δημιουργηθούν χρησιμοποιώντας την εντολή javac
από τη διεπαφή της γραμμής εντολών. Ορισμένα Java IDE όπως το Eclipse και το NetBeans παρέχουν αρχεία εξόδου δημιουργίας .class από την Java του έργου αρχεία.
Μορφή αρχείου τάξης
Ένα αρχείο κλάσης Java αποτελείται από bytecode που είναι ενδιάμεσος κώδικας που θα εκτελεστεί από την JVM. Ένα αρχείο κλάσης αποτελείται από μια ροή byte 8-bit και τα στοιχεία δεδομένων πολλών byte αποθηκεύονται πάντα με μεγάλη σειρά.
Δομή ClassFile
Η δομή του αρχείου κλάσης είναι όπως φαίνεται παρακάτω.
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];
}
όπου:
- u1 = ανυπόγραφη ποσότητα ενός byte
- u2 = ανυπόγραφη ποσότητα δύο byte
- u4 = ανυπόγραφη ποσότητα τεσσάρων byte
Λεπτομέρειες για τη δομή του αρχείου .class επεξηγούνται επίσης στη Oracle μορφή αρχείου κλάσης και μπορούν να παραπεμφθούν από προγραμματιστές για αναφορά. Μια περίληψη αυτών των πεδίων έχει ως εξής.
magic
- Το μαγικό στοιχείο παρέχει τον μαγικό αριθμό που προσδιορίζει τη μορφή αρχείου κλάσης. έχει την τιμή 0xCAFEBABE.- “minor_version”, “major_version” - Οι τιμές των στοιχείων minor_version και major_version είναι οι αριθμοί δευτερεύουσας και κύριας έκδοσης αυτού του αρχείου κλάσης.
constant_pool_count
- Η τιμή του στοιχείου konstant_pool_count είναι ίση με τον αριθμό των εγγραφών στον πίνακα ομαδοποίησης σταθερών συν ένα. Ένας δείκτης konstant_pool θεωρείται έγκυρος εάν είναι μεγαλύτερος από το μηδέν και μικρότερος από το regular_pool_count, με εξαίρεση τις σταθερές τύπου long και double.constant_pool[]
- Το constant_pool είναι ένας πίνακας δομών (§4.4) που αντιπροσωπεύει διάφορες σταθερές συμβολοσειρών, ονόματα κλάσεων και διεπαφής, ονόματα πεδίων και άλλες σταθερές που αναφέρονται στη δομή ClassFile και στις υποδομές της. Η μορφή κάθε καταχώρησης πίνακα σταθερών_ομάδων υποδεικνύεται από το πρώτο byte “tag”.access_flags
- Η τιμή του στοιχείου access_flags είναι μια μάσκα σημαιών που χρησιμοποιείται για να υποδηλώσει δικαιώματα πρόσβασης και ιδιότητες αυτής της κλάσης ή διεπαφής.this_class
- Η τιμή του στοιχείου this_class πρέπει να είναι έγκυρο ευρετήριο στον πίνακα ομαδικής συγκέντρωσης σταθερά.super_class
- Για μια κλάση, η τιμή του στοιχείου super_class είτε πρέπει να είναι μηδέν είτε να είναι έγκυρος δείκτης στον πίνακα ομαδικής συγκέντρωσης σταθερών.Interfaces_count
- Η τιμή του στοιχείου interfaces_count δίνει τον αριθμό των άμεσων υπερδιεπαφών αυτής της κλάσης ή του τύπου διεπαφής.διεπαφές[]
- Κάθε τιμή στον πίνακα διεπαφών πρέπει να είναι ένα έγκυρο ευρετήριο στον πίνακα σταθερών_ομάδων.counts_fields
- Η τιμή του στοιχείου fields_count δίνει τον αριθμό των δομών field_info στον πίνακα πεδίων.πεδία[]
- Κάθε τιμή στον πίνακα πεδίων πρέπει να είναι μια δομή πεδίου_πληροφοριών που δίνει μια πλήρη περιγραφή ενός πεδίου σε αυτήν την κλάση ή τη διεπαφή.methods_count
- Η τιμή του στοιχείου method_count δίνει τον αριθμό των δομών method_info στον πίνακα μεθόδων.methods[]
- Κάθε τιμή στον πίνακα μεθόδων πρέπει να είναι μια δομή method_info που δίνει μια πλήρη περιγραφή μιας μεθόδου σε αυτήν την κλάση ή τη διεπαφή. Εάν καμία από τις σημαίες ACC_NATIVE και ACC_ABSTRACT δεν έχει οριστεί στο στοιχείο access_flags μιας δομής method_info, παρέχονται επίσης οι οδηγίες της εικονικής μηχανής Java που εφαρμόζουν τη μέθοδο.Atributes_count
- Η τιμή του στοιχείου features_count δίνει τον αριθμό των χαρακτηριστικών (§4.7) στον πίνακα χαρακτηριστικών αυτής της κλάσης.χαρακτηριστικά[]
- Κάθε τιμή του πίνακα χαρακτηριστικών πρέπει να είναι μια δομή χαρακτηριστικό_πληροφοριών.