javaBean是一种特殊的java类,主要用于传递数据信息.这种类中方法主要用于访问私有属性,并且方法的命名符合某种规则.
1.javaBean中用来访问和设置私有字段的方法全部命名为set和get方法.
JavaBean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。例如setX方法, 则这个属性是x .至于x用的什么变量来存储的调用者不需要关心.
根据方法名来推断属性的规则:
去掉set前缀,剩余部分就是属性名,如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小的。
setId()的属性名id
isLast()的属性名last
setCPU的属性名是什么?CPU
getUPS的属性名是什么?UPS
总之,一个类被当作javaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量。javaBean可以当做普通的java类来使用.
2.JDK中提供了对JavaBean进行操作的一些API,这套API就称为内省。如果要你自己去通过反射getX方法来访问私有的x,怎么做,有一定难度吧?用内省这套api操作JavaBean比用普通类的方式更方便。
例如ReflectPoint是个javaBean 要获取他的"x"属性的值
ReflectPoint pt1=new ReflectPoint(1, 3);
String propertyName="x";
/*这是普通的反射方法,需要先推断出获取x属性的方法名是getX
Method getX1=pt1.getClass().getDeclaredMethod("getX",null);
System.out.println(getX1.invoke(pt1,null));
*/
//这是用内省的方式来操作javaBean.知道属性名是x即可.
PropertyDescriptor pd=new PropertyDescriptor(propertyName, pt1.getClass());//属性描述符
Method getX=pd.getReadMethod();
Object retVal=getX.invoke(pt1);
System.out.println(retVal);
通过PropertyDescriptor获取到属性描述后,getReadMethod()得到的就是get方法,getWriteMethod()得到的就是该属性的set方法.
还可以用通过IntroSpector.getBeanInfo()这个静态方法得到所有属性的集合,然后遍历之,但是相对复杂.
BeanInfo beanInfo=Introspector.getBeanInfo(pt1.getClass());//BeanInfo对象封装所有的属性
PropertyDescriptor[] pds=beanInfo.getPropertyDescriptors();//得到所有属性的数组
for(PropertyDescriptor propertyDes:pds)//遍历找出"x"
{
if(propertyDes.getName().equals("x"))
{
Method getX1=propertyDes.getReadMethod();
Object retVal1=getX.invoke(pt1);
System.out.println(retVal1);
break;
}
}
3.jdk提供的内省方式并不是操作javaBean最简单的方式,最简单的方式是用BeanUtils工具包
需要导入两个jar包.BeanUtils和logging 具体可以去http://commons.apache.org/下载.可以再eclips中的工程下新建一个lib文件夹,copy到该文件夹下然后add buildpath即可.
//导入BeanUtils工具包后还需要logging包才可以用
BeanUtils.setProperty(pt1, propertyName, "7");//这里set的值是字符串.
System.out.println(BeanUtils.getProperty(pt1, propertyName));
注意:BeanUtils支持属性级联(可以对属性的属性进行set和ge)t 例如类中的一个属性是 Date类的对象 Date本身具有setTime方法
那么可以直接BeanUtils.setProperty(pt1,"date.time","111");
BeanUtils的set和get方法会自动将属性转化为字符串操作. PropertyUtils的set和get方法用的是原始的类型.