JavaBean总结:
本文翻译总结了Core Java Volume II中JavaBean部分的基本内容,作为张孝祥老师Java高新技术JavaBean部分的复习和补充
1. 什么是JavaBean, 为什么要定义JavaBean?
a. 官方的定义是: "A bean is a reusable software component based on Sun's JavaBeans specification that can be manipulatedvisually in a builder tool."
b. 根据a可以看出:
b.1 JavaBean有一个规范
b.2 其作用是提供一个可重用的软件组件
b.3 可以可视化的在一个builder tool内被操作
c. 根据b可以产出, JavaBean可以简化的呈现给用户一个方便的操作工具以更改一些类似对属性操作, 这些操作可能是获取,设置,监听等等
d. JavaBean被广泛的应用在图形化界面的builder tool中,当然, JavaBean完全可以不是可视化的
2. JavaBean的规则是什么?如何自己做一个Bean?
a. 首先说明, Java里面没有提供一个通用的类去继承而产生一个JavaBean的类, Visual Bean可以直接或间接的继承 Component, Non-visual Bean没有一个特殊的类可以继承
b. JavaBean必须是一个public类, 设置getter/setter的成员必须私有,许多Bean工具需要JavaBean类又一个无参的public构造函数
c. JavaBean 的 Naming Pattern
c.1 Naming Pattern of Property:
- Read-Write: getPropertyName(); + setPropertyName();
- Read-Only: getPropertyName();
- Write-Only: setPropertyName();
- Property类别的不仅仅是读取或者设置一个属性这么简单,可以封装完成一些列动作的一个结果,
eg. 例如getImage()就可以使结合了IO流从硬盘读取这个图片并打开这个图片放入一个显示界面内
c.2 Naming Pattern of Property with type boolean
- isPropertyName(); + setPropertyName()
c.3 Naming Pattern of Event
- EventNameEvent 类事件: 这类事件必须继承EventObject 类,并且必须以EventNameEvent的形式书写
- EventNameListener监听器: 对于事件, 更重要的是对事件的监听,事件的监听器需要是想Listener接口,类名称要按EventNameListener, 并按下面的方式定义方法
- addEventNameListener(); removeEventNameListener();getEventNameListener();
3. 如何获取JavaBean的一些属性?
a. JavaBean的全局信息可以被描述\抽取\封装成一个对象BeanDescriptor
b. JavaBean类的每个Property都可以被描述\抽取\封装成一个对象PropertyDescriptor (IndexedPropertyDescriptor)
c. JavaBean类的Event都可以被描述\抽取\封装成一个对象EventSetDescriptor
d. JavaBean类的Method(public)都可以被描述\抽取\封装成一个对象MethodDescriptor
e. a,b,c,d的这些信息都可以通过BeanInfo接口中的方法得到,
e.1 BeanInfo的实现子类是SimpleBeanInfo,
e.2 BeanInfo提供了很多方法可以获得P/E/M/BDescriptor
f. Introspector是一个工具类,里面有很多静态方法,这些方法可以实现对BeanInfo的多种操作
f.1 把字符串变成符合Java规则的变量名称String decapitalize(String name);
f.2 获取BeanInfo信息 getBeanInfo(Class<?> beanClass);
f.3 获取/设置查找BeanInfo类的包的路径: get/setBeanInfoSearchPath();
f.4 Introspector是获得BeanInfo的入口,其机制是通过反射实现的,可以说Introspector是专门针对JavaBean的反射
g. 获取路线
Introspector-->BeanInfo--- BeanDescriptor
|---- PropertyDescriptor ---- PropertyEditor(Support/Manager)
|---- EventSetDescriptor
|---- MethodDescriptor ---- ParameterDescriptor
4. 如何过滤掉一些不需要的JavaBean属性?
a. 并不是所有满足set/get等JavaBean定义规则的属性都是需要暴露出去的JavaBean属性
b. 要满足a的需求就要自己建一个实现BeanInfo的类,一般选择继承SimpleBeanInfo
c. 内部定义PropertyDescriptor[] 内部转载 需要的关于一个JavaBean类的某个Property的PropertyDescriptor
d. 复写getPropertyDescriptors()函数,选择返回需要获取的JavaBean
// FilteredBeanInfo for Introspector to get myJavaBean's Properties
class MyFilteredBeanInfo extends SimpleBeanInfo{ // --> b.
private PropertyDescriptor[] propertyDescriptors=new PropertyDescriptor[]{
new PropertyDescriptor("myFilteredProperty",myJavaBean.class);
}; // --> c.
public PropertyDescriptors[] getPropertyDescriptors(){
return propertyDescriptors; // --> d.
}
}
5. 如何存储JavaBean的一些属性?
a. 需要用到JSP知识,以后总结
6. 如何用Java自带的java.Beans包获取JavaBean的方法?
7. BeanUtils包是如何获取JavaBean的方法的, 相比较6中的方法有什么方便之处?
8. BeanUtils的结构是什么样的?
参考资料: Core Java VolumeII 8th Edition, Cay S.Horstmann & Gary Cornell