Όταν δημιουργείτε νέα συστατικά στοιχεία ή beans που θα χρησιμοποιήσετε στη λειτουργία επεξεργασίας γραφικού περιβάλλοντος (για παράδειγμα, προσθήκη συστατικών στοιχείων στην παλέτα), μπορείτε να ελέγχετε τη συμπεριφορά τους, παρέχοντας μια κλάση BeanInfo.
Μια κλάση BeanInfo υλοποιεί την java.beans.BeanInfo και χρησιμοποιείται από τη λειτουργία επεξεργασίας γραφικού περιβάλλοντος για τον καθορισμό της συμπεριφοράς της προβολής ιδιοτήτων για το bean και για το αν υπάρχει διαθέσιμο πλαίσιο διαλόγου προσαρμογής. Η λειτουργία επεξεργασίας γραφικού περιβάλλοντος συμπεριλαμβάνει κλάσεις BeanInfo για κοινούς ελέγχους AWT και Swing.
Καθώς η κλάση BeanInfo περιέχει πληροφορίες οι οποίες χρειάζονται κατά το χρόνο σχεδίασης, συνήθως βρίσκεται σε ένα έργο διαφορετικό από αυτό της κλάσης bean και δεν συμπεριλαμβάνεται κατά τη διανομή του bean. Η λειτουργία επεξεργασίας γραφικού περιβάλλοντος για τη Java χρησιμοποιεί ένα πλήθος κανόνων που σας επιτρέπουν να συσχετίζετε κλάσεις BeanInfo με τα Java beans που περιγράφουν. Θα πρέπει να κατανοήσετε τους κανόνες αυτούς, αν χρησιμοποιείτε Java beans που διαθέτουν κλάσεις BeanInfo οι οποίες θέλετε να εντοπίζονται από τη λειτουργία επεξεργασίας γραφικού περιβάλλοντος. Για παράδειγμα, αν χρησιμοποιείτε ένα σύνολο κλάσεων Java bean από τρίτο προμηθευτή ή αν έχετε αναπτύξει Java beans και κλάσεις BeanInfo που χρησιμοποιείτε.
Για περισσότερες πληροφορίες σχετικά με τις κλάσεις BeanInfo, μπορείτε να μεταφορτώσετε την προδιαγραφή JavaBeans από τη διεύθυνση java.sun.com/products/javabeans/docs/.
Η κλάση java.beans.Introspector χρησιμοποιείται για τον εντοπισμό μιας κλάσης BeanInfo για ένα Java bean. Η στιγμή κατά την οποία συμβαίνει αυτό αναφέρεται ως αυτοανάλυση και πραγματοποιείται από τη λειτουργία επεξεργασίας γραφικού περιβάλλοντος την πρώτη φορά κατά την οποία χρησιμοποιείται ένα bean. Για παράδειγμα, όταν μεταφέρετε για πρώτη φορά ένα κουμπί από την παλέτα, τότε πραγματοποιείται αυτοανάλυση η οποία προσπαθεί να εντοπίσει τη σωστή κλάση BeanInfo. Μετά την αυτοανάλυση του bean, τα αποτελέσματα αποθηκεύονται στη λανθάνουσα μνήμη (cache) βοηθώντας έτσι στην απόδοση. Ωστόσο, όταν η λειτουργία επεξεργασίας γραφικού περιβάλλοντος εντοπίζει ότι η κλάση BeanInfo μπορεί να έχει αλλάξει και η λανθάνουσα μνήμη είναι ανενεργή, τότε πραγματοποιείται εκ νέου αυτοανάλυση.
Αυτοανάλυση ενός bean πραγματοποιείται με κλήση της στατικής μεθόδου getBeanInfo(Class) με την κλάση bean ως όρισμα. Για παράδειγμα:
java.beans.Introspector.getBeanInfo(MyJavaBean.class)
Η λειτουργία αυτοανάλυσης χρησιμοποιεί δοκιμές για να εντοπίσει μια κλάση BeanInfo για την κλάση MyJavaBean του ορίσματος. Αν κάποια δοκιμή είναι επιτυχής, τότε η λειτουργία αυτοανάλυσης σταματά την αναζήτηση. Εάν κάποιο βήμα αποτύχει, η λειτουργία αυτοανάλυσης επιχειρεί την επόμενη δοκιμή για τον εντοπισμό της κλάσης BeanInfo. Η λειτουργία αυτοανάλυσης χρησιμοποιεί τις παρακάτω λογικές δοκιμές:
Αν βρεθεί μια BeanInfo για την κλάση αυτή, τότε η λειτουργία αυτοανάλυσης δεν την επιστρέφει ρητά. Αντίθετα, χρησιμοποιεί τα στοιχεία της για να δημιουργήσει μια προσωρινή κλάση η οποία υλοποιεί την java.beans.BeanInfo.
Ο καλύτερος τρόπος για να κατανοήσετε τη διαδρομή BeanInfo είναι να εξετάσετε την εικονική μηχανή Java η οποία δημιουργείται για την εκτέλεση της αυτοανάλυσης. Σε αυτή την εικονική μηχανή παρέχεται μια διαδρομή κλάσεων η οποία απαρτίζεται από τις ακόλουθες καταχωρήσεις:
Αφού έχει δημιουργηθεί η εικονική μηχανή, η κλάση java.beans.Introspector διαθέτει τη δική της λίστα πακέτων για την αναζήτηση κλάσεων BeanInfo που έχουν οριστεί με τη μέθοδο public void setSearchPath(String[]).
Τα ορίσματα στη μέθοδο αυτή είναι:
Αν το bean το οποίο εγγράφετε εμπεριέχει γνωρίσματα από μια υπερ-κλάση, η προεπιλεγμένη BeanInfo δεν θα εκθέτει τα εγγενή γνωρίσματα. Πρέπει να τα εκθέσετε εσείς ρητώς, χρησιμοποιώντας τη μέθοδο getAdditionalBeanInfo().
Για παράδειγμα:
public BeanInfo[] getAdditionalBeanInfo() { try { // The following will return all inherited features. return new BeanInfo[] { Introspector.getBeanInfo(MyPanel.class.getSuperclass())}; } catch (IntrospectionException e) { return new BeanInfo[0]; }
Αν ένα εγγενές γνώρισμα δεν εκτίθεται, τότε η λειτουργία επεξεργασίας γραφικού περιβάλλοντος δεν θα το αποδίδει, ακόμη κι αν αυτό ορίζεται στον πρωτογενή κώδικα.