Beans (Básico)

�C�lo examinan las herramientas de desarrollo a un Bean para exponer sus caracter�sitcas (propiedades, eventos y m�todos) en un hoja de propiedades? Utilizando la clase java.beans.Introspector. Esta clase utiliza el coraz�n de reflexi�n del API del JDK para descubrir los m�todos del Bean, y luego aplica los patrones de dise�o de los JavaBeans para descubrir sus caracter�sitcas. Este proceso de descubrimiento se llama introspecci�n.

De forma alternativa, se pueden exponer expl�citamente las caractericas del Bean en una clase asociada separada que implemente el interface BeanInfo. Asociando una clase BeanInfo con un Bean se puede.

  • Exponer solo aquellas caracter�sticas que queremos exponer.
  • Relegar en BeanInfo la exposici�n de algunas caracter�sitcas del Bean, mientras se deja el resto para la reflexi�n de bajo nivel.
  • Asociar un icono con el Bean fuente.
  • Especificar una clase personaliza.
  • Segregar las caracter�sitcas entre normales y expertas.
  • Proporcionar un nombre m�s descriptivo, informaci�n adicional sobre la caracter�sitca del Bean.

BeanInfo define m�todos que devuelven descriptores para cada propiedad, m�todo o evento que se quiere exponer. Aqu� tienes los prototipos de estos m�todos.

PropertyDescriptor[] getPropertyDescriptors();
MethodDescriptor[]   getMethodDescriptors();
EventSetDescriptor[] getEventSetDescriptors();

Cada uno de estos m�todos devuelve un array de descriptores para cada caracter�sitca.

.�Descriptores de Caracterisitcas

Las clases BeanInfo contienen descriptores que precisamente describen las caracter�sticas del Bean fuente. El BDK implementa las siguientes clases.

  • FeatureDescriptor es la clase base para las otras clases de descriptores. Declara los aspectos comunes a todos los tipos de descriptores.
  • BeanDescriptor describe el tipo de la clase y el nombre del Bean fuente y describe la clase personalizada del Bean fuente si existe.
  • PropertyDescriptor describe las propiedades del Bean fuente.
  • IndexedPropertyDescriptor es una subclase de PropertyDescriptor, y describe las propiedades indexadas del Bean fuente.
  • EventSetDescriptor describe los eventos lanzados por el Bean fuente.
  • MethodDescriptor describe los m�todos del Bean fuente.
  • ParameterDescriptor describe los par�metros de m�todos.

El interface BeanInfo declara m�todos que devuelven arrays de los descriptores anteriores.

.�Crear una Clase BeanInfo

Utilizaremos la clase ExplicitButtonBeanInfo para ilustrar la creaci�n de una clase BeanInfo. Aqu� est�n los pasos generales para crear una clase BeanInfo.

  1. Nombrar la clase BeanInfo. Se debe a�adir el estring "BeanInfo" al nombre de la clase fuente. Si el nombre de la clase fuente es ExplicitButton, la clase BeanInfo asociada se debe llamar ExplicitButtonBeanInfo
  2. Subclasificar SimpleBeanInfo. Esta es una clase de conveniencia que implementa los m�todos de BeanInfo para que devuelvan null o un valor nulo equivalente.
    public class ExplicitButtonBeanInfo extends SimpleBeanInfo {
    

    Utilizando SimpleBeanInfo nos ahorramos tener que implementar todos los m�todos de BeanInfo; solo tenemos que sobreescribir aquellos m�todos que necesitemos.

  3. Sobreescribir los m�todos apropiados para devolver las propiedades, los m�todos o los eventos que queremos exponer. ExplicitButtonBeanInfo sobreescribe el m�todo getPropertyDescriptors() para devolver cuatro propiedades.
    public PropertyDescriptor[] getPropertyDescriptors() {
    try {  
    PropertyDescriptor background =
             		new PropertyDescriptor("background", beanClass);
           		PropertyDescriptor foreground =
             			new PropertyDescriptor("foreground", beanClass);
           		PropertyDescriptor font =
             			new PropertyDescriptor("font", beanClass);
           		PropertyDescriptor label =
             			new PropertyDescriptor("label", beanClass);
     
           		background.setBound(true);
           		foreground.setBound(true);
           		font.setBound(true);
           		label.setBound(true);
             
           		PropertyDescriptor rv[] =
             			{background, foreground, font, label};
           		return rv;
          	} catch (IntrospectionException e) {
             		throw new Error(e.toString());
            }
    }        
    

    Existen dos cosas importantes que observar aqu�:

    • Si se deja fuera alg�n descriptor, la propiedad, evento o m�todo no descrito no se expondr�. En otras palabras, se puede exponer selectivamente las propiedades, eventos o m�todos, dejando fuera las que no queramos exponer.
    • Si un m�todo obtenedor de caracter�sticas (por ejemplo getMethodDescriptor()) devuelve Null, se utilizar� la reflexi�n de bajo nivel para esa caracter�sitca. Esto significa, por ejemplo, que se pueden expecificar explicitamente propiedades, y dejar que la reflexi�n de bajo nivel descubra los m�todos. Si no se sobreescribe el m�todo por defecto de SimpleBeanInfo que devuelve null, la reflexi�n de bajo nivel se utilizar� para esta caracter�stica.
  4. Optionalmente, asociar un icono con el Bean fuente.
    public java.awt.Image getIcon(int iconKind) {
            if (iconKind == BeanInfo.ICON_MONO_16x16 ||
                iconKind == BeanInfo.ICON_COLOR_16x16 ) {
                java.awt.Image img = loadImage("ExplicitButtonIcon16.gif");
                return img;
            }
            if (iconKind == BeanInfo.ICON_MONO_32x32 ||
                iconKind == BeanInfo.ICON_COLOR_32x32 ) {
                java.awt.Image img = loadImage("ExplicitButtonIcon32.gif");
                return img;
            }
            return null;
    }
    

    El BeanBox muestra el icono junto al nombre del Bean en el ToolBox. Se puede esperar que las herramientas de desarrollo hagan algo similar.

  5. Especificar la clase del Bean fuente, y , si el Bean est� personalizado, especificarlo tambi�n.
    public BeanDescriptor getBeanDescriptor() {
            return new BeanDescriptor(beanClass, customizerClass);
    }
         ...
         private final static Class beanClass = ExplicitButton.class;
         private final static Class customizerClass = OurButtonCustomizer.class;
    

Guarda la clase BeanInfo en el mismo directorio que la clase fuente. El BeanBox busca primero la clase BeanInfo de un Bean en el path del paquete del Bean. Si no se encuentra el BeanInfo, entonces la informaci�n del Bean busca en el path (mantenido por el Introspector). La informaci�n del Bean se busca por defecto en el path sun.beans.infos. Si no se encuentra la clase BeanInfo, se utiliza la reflexi�n de bajo nivel para descrubrir las caracter�sticas del Bean.

.�Utilizar BeanInfo para Controlar las Caracter�sticas a Exponer

Si reparamos en la reflexi�n del bajo nivel para descubrir las caracter�sticas del Bean, todas aquellas propiedades, m�todos y eventos que conformen el patr�n de dise�o apropiado ser�n expuestas en una herramienta de desarrollo. Esto incluye cualquier caracter�stica de la clase base. Si el BeanBox encuentra una clase BeanInfo asociada, entonces la informaci�n es utiliza en su lugar, y no se examinan m�s clases base utilizando la reflexi�n. En otras palabras, la informaci�n del BeanInfo sobreescribe la informaci�n de la reflexi�n de bajo nivel, y evita el examen de la clase base.

Mediante la utilizaci�n de una clase BeanInfo, se pueden exponer subconjuntos de una caracter�stica particular del Bean. Por ejemplo, mediante la no devoluci�n de un m�todo descriptor para un m�todo particular, ese m�todo no ser� expuesto en una herramienta de desarrollo.

Cuando se utiliza la clase BeanInfo

  • Las caracter�sticas de la clase base no ser�n expuestas. Se pueden recuperar las caracter�sticas de la clase base utilizando el m�todo BeanInfo.getAdditionalBeanInfo().
  • Las propiedades, eventos o m�todos que no tengan descriptor no ser�n expuestos. Para una caracter�stica particular, s�lo aquellos �tems devueltos en el array de descriptores ser�n expuestos. Por ejemplo, si devolvemos descriptores para todos los m�todos de un Bean excepto foo(), entonces foo() no ser� expuesto.
  • La reflexi�n de bajo nivel ser� utilizada para las caracter�sticas cuyos metodos obtenedores devuelvan null. Por ejemplo su nuestra clase BeanInfo contiene esta implementaci�n de m�todos.
    public MethodDescriptor[] getMethodDescriptors() {
    return null;
    }
    

    Entonces la reflexi�n de bajo nivel se utilizar� para descubrir los m�todos p�blicos del Bean.

.�Localizar las clases BeanInfo

Antes de examinar un Bean, el Introspector intentar� encontrar una clase BeanInfo asociada con el bean. Por defecto, el Introspector toma el nombre del paquete del Bean totalmente cualificado, y le a�ade "BeanInfo" para formar un nuevo nombre de clase. Por ejemplo, si el Bean fuente es sunw.demo.buttons.ExplicitButton, el Introspector intentar� localizar sunw.demo.buttons.ExplicitButtonBeanInfo.

Si esto falla, se buscar� en todos los paquetes en el path de BeanInfo. El path de b�squeda de BeanInfo es mantenido por Introspector.setBeanInfoSearchPath() y Introspector.getBeanInfoSearchPath().

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
SIGUIENTE ARTÍCULO