Hvis du opretter nye komponenter eller beans til brug i den visuelle editor (f.eks. tilføjelse af komponenter til en palet), kan du styre deres funktionsmåde ved at anvende en BeanInfo-klasse.
En BeanInfo-klasse implementerer java.beans.BeanInfo, og den benyttes af den visuelle editor til at bestemme funktionaliteten af bean'ens egenskabsoversigt, og om en tilpasningfunktion er tilgængelig. Den visuelle editor inkluderer BeanInfo-klasser til fælles AWT- og Swing-kontrolenheder.
Da BeanInfo-klassen indeholder oplysninger, der kun kræves på designtidspunktet, er den oftest placeret i et andet projekt end selve bean-klassen og er ikke inkluderet, når bean'en distribueres. Den visuelle editor til Java anvender en række regler, der tillader, at du kan knytte BeanInfo-klasser til de Java-beans, de beskriver. Du skal forstå disse regler, hvis du bruger Java-beans med BeanInfo-klasser, som den visuelle editor skal registrere. Hvis du f.eks. bruger et tredjeparts sæt Java-bean-klasser, eller hvis du har udviklet Java-beans og BeanInfo-klasser, som du bruger.
Hvis du vil læse mere om BeanInfo-klasser, kan du overføre JavaBean-specifikationen fra java.sun.com/products/javabeans/docs/.
Klassen java.beans.Introspector bruges til at finde en BeanInfo-klasse til en Java-bean. Det tidspunkt, dette sker på, kaldes for introspektion, og det udføres af den visuelle editor, første gang en bean benyttes. Når en knap f.eks. placeres fra paletten første gang, finder introspektion sted, som forsøger at finde den korrekte BeanInfo-klasse. Når der er foretaget introspektion af bean'en, caches resultaterne for at hjælpe på ydeevnen. Når den visuelle editor registrerer, at BeanInfo-klassen muligvis er ændret, og cachen er forældet, finder introspektion sted igen.
Introspektion af en bean udføres, ved at static-metoden getBeanInfo(Class) kaldes med bean-klassen som argument. Eksempel:
java.beans.Introspector.getBeanInfo(MyJavaBean.class)
Introspektoren benytter test til at finde en BeanInfo-klasse til argumentklassen MyJavaBean. Når en test er udført uden fejl, ophører introspektoren med at søge. Hvis et trin ikke udføres, prøver introspektoren at udføre den næste test til at finde BeanInfo-klassen. Introspektoren bruger følgende logiske test:
Hvis en BeanInfo-klasse findes for klassen, returnerer introspektoren den ikke eksplicit. Den bruger i stedet for sine oplysninger til at oprette en midlertidig resultatklasse, der implementerer java.beans.BeanInfo.
Den bedste måde at forstå BeanInfo-stien på er at gennemgå den virtuelle Java-maskine, der oprettes for at foretage introspektion. Den virtuelle maskine får en klassesti, som består af følgende angivelser:
Når den virtuelle maskine er oprettet, har java.beans.Introspector en liste over de pakker, der skal søges i efter BeanInfo-klassesæt med metoden public void setSearchPath(String[]).
Argumenterne til denne metode er:
Hvis den bean, du skriver, overtager attributter fra en overordnet klasse, viser standard-BeanInfo'en ikke de overtagne attributter. Du skal vise dem eksplicit med metoden getAdditionalBeanInfo().
Eksempel:
public BeanInfo[] getAdditionalBeanInfo() { try { // Følgende returnerer alle overtagne funktioner. return new BeanInfo[] { Introspector.getBeanInfo(MyPanel.class.getSuperclass())}; } catch (IntrospectionException e) { return new BeanInfo[0]; }
Hvis en overtaget attribut ikke vises, gengiver den visuelle editor den ikke, selvom den er angivet i kildekoden.