有关java bean一些学习体会

来源:互联网 发布:名器哪款接近真人知乎 编辑:程序博客网 时间:2024/04/29 15:42

 

1 什么是java bean?

         java bean只是一个遵守了某些比较严格的方法命名规范的类.最初是为了方便gui工具.它同ejb是本质上不同的两种东西

2 有哪些命名规范?

         如果提供了显式的有参构造函数,应再提供一个显式的无参构造函数. 依据成对的get,set方法设置和获得属性.例如getName(),setName(String name).存在这两个方法并不是说明一定存在一个叫做name的数据成员;get和set不一定都要出现,这时分别叫做只读属性,或只写属性

 

 Property name/type               Get method                            Set method 

 

  xcoordinate/Double     public Double getXcoordinate()  publicvoid setXcoordinate 

                                                              (DoublenewValue) 

 

  xCoordinate/Double     public Double getxCoordinate()  publicvoid setxCoordinate 

                                                              (Double newValue) 

 

  XCoordinate/Double     public Double getXCoordinate()  publicvoid setXCoordinate 

                                                              (Double newValue) 

 

  Xcoordinate/Double     Not allowed                         Not allowed 

 

  student/Boolean        public Boolean getStudent()         publicvoid setStudent(Boolean 

                                                             newValue) 

 

  student/boolean        public boolean getStudent()         public void setStudent(boolean 

                         public boolean isStudent()          newValue) 

 

3 java bean有哪些种类?

  分为4种Simple Properties,Indexed Properties,bound Properties,Constraint Properties.

   Indexed Properties 一般有两对方法:

  Type[] getPropertyName()

void setPropertyName(Type[] newValue)

Type getPropertyName(int i)

void setPropertyName(int i, Type newValue)

 bound Properties
   当属性的值改变时,它要产生一个PropertyChangeEvent,给所有已注册的监听者.类要提供这样的方法:       

void addPropertyChangeListener(PropertyChangeListener listener)

void removePropertyChangeListener(PropertyChangeListener listener)
java.beans.PropertyChangeSupport类提供了方便的包装 
下面是演示

private PropertyChangeSupport changeSupport = newPropertyChangeSupport(this);


 

public void addPropertyChangeListener(PropertyChangeListener listener){

changeSupport.addPropertyChangeListener(listener);

}

public void removePropertyChangeListener(PropertyChangeListener listener){

changeSupport.removePropertyChangeListener(listener);

}

public PropertyChangeListener[] getPropertyChangeListeners(){

   return changeSupport.getPropertyChangeListeners();

}


public void setValue(Type newValue){

  Type oldValue =getValue();

value =newValue;

changeSupport.firePropertyChange("propertyName", oldValue,newValue);

}



Constraint Properties. 当在属性的set方法中想要改变属性的值时,先产生一个通知,给所有的java.beans.VetoableChangeListener 

 

如果有一个产生了否定了改变,那么这个listener会产生一个异常,并回传到这个set方法,这个set方法抛出这个异常,改变程 序的执行路径.代码演示

如下:

public void setValue(Type newValue) throws PropertyVetoException{

   Type oldValue = getValue();
   vetoSupport.fireVetoableChange("value", oldValue, newValue);
   // 能够继续执行,说明并没有任何一个监听者否决了改变
   value = newValue;
   changeSupport.firePropertyChange("value", oldValue, newValue);
}
 4 打包bean类文件的注意事项 
具有能产生事件的bean写好后.为了使gui build tool能够使用,要打成jar包,在manifest文件中
Manifest-Version: 1.0

Name: com/horstmann/corejava/ImageViewerBean.class
Java-Bean: True
 Name: com/horstmann/corejava/FileNameBean.class
Java-Bean: True

 (注意,版本号后有一个新行,中间有一个空行,最后也还有一个空行

5 关于BeanInfo接口的作用?

提供一个更灵活的机制来展现java bean 的属性,因为当一个bean变得复杂时,并不是所有的get,set方法都是属性,

而且肯定有些属性是内部属性,完全依赖反射得不到我们想要的结果.这时定义一个对象实现了BeanInfo接口就是一个好的解决办法

如果你有一个bean叫做ImageViewerBean,那么相应的BeanInfo的类文件必须在同一个包中,并且叫做ImageViewerBeanBeanInfo

你并不用实现BeanInfo接口的所有方法,extend java.beans.SimpleBeanInfo是一个适配器的模式.

对于每一个属性,构造一个PropertyDescriptor,参数是property name和含有它的类:

PropertyDescriptor descriptor = new PropertyDescriptor("fileName", ImageViewerBean.class);

实现BeanInfo 接口的getPropertyDescriptors方法,返回所有你想展示的属性



其他BeanInfo接口的方法返回EventSetDescriptorMethodDescriptor的数组,但并不常用

如果这些返回描述符数组的方法返回null,那么标准的反射机制使用了.


BeanInfo接口的getIcon方法给bean一个icon,它可以显示在builder tool的面板上,

事实上有四种大小 :ICON_COLOR_16x16,ICON_COLOR_32x32,ICON_MONO_16x16,ICON_MONO_32x32

 

下面是一个示例:
public class ImageViewerBeanBeanInfo extends SimpleBeanInfo{
   public ImageViewerBeanBeanInfo() {
      iconColor16 = loadImage("ImageViewerBean_COLOR_16x16.gif");
      iconColor32 = loadImage("ImageViewerBean_COLOR_32x32.gif");
      iconMono16 = loadImage("ImageViewerBean_MONO_16x16.gif");
      iconMono32 = loadImage("ImageViewerBean_MONO_32x32.gif");
   }
  public Image getIcon(int iconType)
   {
      if (iconType == BeanInfo.ICON_COLOR_16x16) return iconColor16;
      else if (iconType == BeanInfo.ICON_COLOR_32x32) return iconColor32;
      else if (iconType == BeanInfo.ICON_MONO_16x16) return iconMono16;
      else if (iconType == BeanInfo.ICON_MONO_32x32) return iconMono32;
      else return null;
   }
 
   private Image iconColor16;
   private Image iconColor32;
   private Image iconMono16;
   private Image iconMono32;
}

 

 

原创粉丝点击