Jeśli użytkownik tworzy nowe komponenty do użycia w edytorze elementów wizualnych (na przykład dodaje komponenty do palety), może sterować ich zachowaniem przez podanie klasy BeanInfo.
Klasa BeanInfo implementuje klasę java.beans.BeanInfo i służy w edytorze elementów wizualnych do określania zachowania widoku właściwości komponentu Bean oraz możliwości jego dostosowywania. Edytor elementów wizualnych zawiera klasy BeanInfo dla wspólnych elementów sterujących AWT i Swing.
Ponieważ klasa BeanInfo zawiera informacje wymagane tylko w czasie projektowania, jest zwykle przechowywana w innym projekcie niż klasa komponentu Bean i nie jest włączana przy wdrażaniu komponentu Bean. Edytor Visual Editor for Java stosuje szereg reguł określających możliwość powiązywania klas BeanInfo z opisywanymi przez nie komponentami Java Bean. Jeśli użytkownik stosuje komponenty Java Bean z klasami BeanInfo, które mają być wykrywane przez edytor elementów wizualnych, musi znać te reguły. Ich znajomość jest na przykład wymagana, gdy używany jest zestaw klas komponentów Java Bean pochodzący z innej firmy lub gdy komponenty Java Bean i klasy BeanInfo opracowano samodzielnie.
Aby dowiedzieć się więcej na temat klas JavaBean, można pobrać specyfikację komponentów Java Bean ze strony java.sun.com/products/javabeans/docs/.
Klasa java.beans.Introspector służy do znajdowania klasy BeanInfo dla komponentu Java Bean. Jest to tak zwana introspekcja i ma miejsce w edytorze elementów wizualnych przy pierwszym użyciu komponentu Bean. Na przykład introspekcja po pierwszym przeciągnięciu przycisku z palety i jego upuszczeniu próbuje znaleźć poprawną klasę BeanInfo. Wyniki introspekcji są przechowywane w pamięci podręcznej, aby podnieść wydajność środowiska. Jeśli edytor elementów wizualnych wykryje, że klasa BeanInfo uległa zmianie, a treść pamięci podręcznej jest nieaktualna, introspekcja jest wykonywana ponownie.
Introspekcja komponentu Bean jest wykonywana przez wywołanie metody static getBeanInfo(Class) z klasą komponentu Bean jako argumentem. Na przykład:
java.beans.Introspector.getBeanInfo(MyJavaBean.class).
Introspekcja znajduje klasę BeanInfo dla klasy argumentu MyJavaBean, stosując testy. Jeśli którykolwiek test się powiedzie, introspekcja zakończy poszukiwanie. Jeśli krok się nie powiedzie, introspekcja wykona następny test w celu znalezienia klasy BeanInfo. Introspekcja stosuje następujące testy logiczne:
Jeśli klasa BeanInfo dla klasy zostanie znaleziona, mechanizm introspekcji nie zwraca jej jawnie, ale używa jej do utworzenia tymczasowej klasy wyników, która implementuje klasę java.beans.BeanInfo.
Aby zrozumieć, czym jest ścieżka wyszukiwania BeanInfo, należy przyjrzeć się wirtualnej maszynie Java tworzonej w celu wykonania introspekcji. Do maszyny wirtualnej jest przekazywana ścieżka klasy, którą tworzą następujące wpisy:
Po utworzeniu maszyny wirtualnej klasa java.beans.Introspector ma własną listę pakietów, w których będą wyszukiwane klasy BeanInfo z metodą public void setSearchPath(String[]).
Argumenty tej metody to:
Jeśli tworzony komponent Java Bean dziedziczy atrybuty z nadklasy, domyślna klasa BeanInfo nie ujawnia swoich atrybutów. Atrybuty należy wprost ujawnić, używając metody getAdditionalBeanInfo().
Na przykład:
public BeanInfo[] getAdditionalBeanInfo() { try { // Metoda zwróci wszystkie cechy dziedziczone. return new BeanInfo[] { Introspector.getBeanInfo(MyPanel.class.getSuperclass())}; } catch (IntrospectionException e) { return new BeanInfo[0]; }
Jeśli atrybut klasy BeanInfo nie zostanie ujawniony, edytor elementów wizualnych nie będzie go wyświetlał, nawet jeśli został ustawiony w kodzie źródłowym.