Java对象之JavaBean

使用javabean已经很久了,但是很少去研究和使用jdk中的java.beans包和java.beans.beancontext包。
时间和空间这个计算机的永恒话题,也一直是设计的折衷话题。记得刚开始写javabean的时候,对象的set get都是一行一行代码的手写。一次几十个方法下来,而且复制粘贴,复杂,维护修改都很费力。
现在apache jakarta commons的子项目已经有一些解决方案了,主要在包org.apache.commons.beanutils中,使用可以参见Test Case和《Jakarta Commons Cookbook》。当然,有时候也需要我们自己根据自己的应用编写自己的处理javabean的代码。今天正好看到了一些java.beans的代码,罗列如下:
java.beans.Introspector
public static String decapitalize(String name) {
if (name == null || name.length() == 0) {
return name;
}
if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) && Character.isUpperCase(name.charAt(0))) {
return name;
}
char chars[] = name.toCharArray();
chars[0] = Character.toLowerCase(chars[0]);
return new String(chars);
}
java.beans.PropertyDescriptor
public PropertyDescriptor(String propertyName, Class beanClass) throws IntrospectionException {
if (propertyName == null || propertyName.length() == 0) {
throw new IntrospectionException(“bad property name”);
}
setName(propertyName);
String base = capitalize(propertyName);

// Since there can be multiple setter methods but only one getter
// method, find the getter method first so that you know what the
// property type is. For booleans, there can be “is” and “get”
// methods. If an “is” method exists, this is the official
// reader method so look for this one first.
try {
readMethod = Introspector.findMethod(beanClass, “is” + base, 0);
} catch (Exception getterExc) {
// no “is” method, so look for a “get” method.
readMethod = Introspector.findMethod(beanClass, “get” + base, 0);
}
Class params[] = { readMethod.getReturnType() };
writeMethod = Introspector.findMethod(beanClass, “set” + base, 1, params);
propertyType = findPropertyType(readMethod, writeMethod);
}
(注:代码格式为eclipse默认设置)
我没有读过javabean的规范,今天针对javabean的使用和操作随处可见,也算是Rod Johnson所说的fake object了。如果javabean的property命名不符合规范,就有可能出错,一旦这种错误被framework捕获了还没有throw给应用,那么发现这种命名错误就更困难了。

如今我会优先选择commons-beanutils和jdk的java.beans对java bean进行操作。