一、javaBean
JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性。
如: public ReflectPoint {
private int x;
public int getX(){
return x;
}
public void setX(int x){
this.x = x;
}
}
二、内省
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
除了反射用到的类需要引入外,内省需要引入的类如上所示,它们都属于java.beans包中的类,自己写程序的时候也不能忘了引入相应的包或者类。下面代码片断是一个设置某个JavaBean类某个属性的关键代码:
private static void setObjectProperty(ReflectPoint pt1, int value,String propName) throws IntrospectionException, IllegalAccessException, InvocationTargetException {
/*BeanInfo bean = Introspector.getBeanInfo(ReflectPoint.class);
PropertyDescriptor [] properties = bean.getPropertyDescriptors();
for(PropertyDescriptor property: properties)
{
if(property.getName().equals(propName))
{
Method mSetX = property.getWriteMethod();
mSetX.invoke(pt1, value);
break;
}
}*/
PropertyDescriptor property = new PropertyDescriptor("x",ReflectPoint.class);
Method mSetX = property.getWriteMethod();
mSetX.invoke(pt1, value);
}
代码中注释的语句代表一种方式,最后的三行代表另外一种设置相应类相应属性的方式。从简洁上来说,第二种方式显然更优雅。第一种方式中首先是获得相应javaBean的类信息bean,用的BeanInfo这个类来描述的。然后就能够通过getPropertyDescriptors方法获取属性描述数组对象。最后从数组中取去一个个的属性对象进行操作——获取相应的读写方法,然后调用相应的读写方法。这些是通过反射机制做到的。由于这种方式比较麻烦,如果只调用其中一种方法,就要遍历一次属性描述数组,所以就产生了第二种方式,直接通过传入属性名称,相应的javaBean类型参数,构造出一个需要的PropertyDescriptor对象,然后再进行调用。
三、BeanUtils
BeanUtils提供对 Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。我们知道,一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处理导致大量get/set代码堆积,增加了代码长度和阅读代码的难度。