------- android培训、java培训、期待与您交流! ----------
JavaBean:
在一个Person类中,我们可以把它当作一个普通类来操作,比如该类对象调用getAge方法可以得到该对象私有成员属性age的值。但我们仔细看一下该类,你会发现有一种规律,比如:setAge(中文意思是设置年龄)、setName(中文意思是设置名字),没错,这种规律符合setter,getter命名规范,这时我们就可以把这种类称为javaBean类,由这种规范推算出来的成员属性称之为javaBean属性,至于java类内部的成员属性是怎样的我们根本不用去管,也管不了,因为那些都是私有的成员变量。当一个类一旦成为javaBean类时,我们就可以用一些特殊的方式去操作它,比如内省。
示例代码:
calss Person{
privateint age;
privateString name;
publicvoid setAge(int age){
this.age=age;
}
public intgetAge(){
return this.age;
}
public voidsetName(int name){
this. name = name;
}
public intgetName(){
return this.name;
}
}
如果要在两个模块之间传递多个信息,可以将数据信息封装到一个javabean中,这种javabean的实例对象通常称为值对象。 (Value Object,简称VO)。这些信息在类中用私有字段来存储,如果读取或者设置这些字段的值,则需要通过一些相应的方法来访问,那么这些方法的名称叫什么好呢?javabean的属性是根据其中的setter getter方法来确定的,而不是根据其中的成员变量。如果方法名为setId,中文意思即为设置id ,至于你把它存到哪个变量上,用管吗?如果方法名为getId,中文意思为获取id,至于你从哪个变量上取,用管吗?去掉set前缀,剩余部分就是属性名,如果剩余的第二个字母是小写,则把剩余部分的首字母改成小的。
setId的属性名->id
isLast()的属性名->last
setCPU的属性名是?->CPU
总之一个类被当做javaBean使用时,javaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量。
1,在javaEE开发中,经常要使用到javaBean。很多环境就要求按javaBean方式进行操作,别人都这么用和要求这么做,那你就没什么挑选的余地!
2,Jdk中提供了对javaBean进行操作的一些Api,这套API就称为内省。如果要你自己去通过getX方法来访问私有的x,怎么做,有一定难度吧?用内省这套api操作javaBean比用普通类的方式更方便。
定义一个类,把它当作javaBean来操作。:
calss Reflectpoint{
privateint x; //私有成员属性
privateint y; //私有成员属性
Reflectpoint(intx,int y){//带参构造函数
this.x=x;
this.y=y;
}
//setter,getter方法。
publicvoid setX(int x){//设置x的值
this.x=x;
}
public intgetX(){//获取x的值
return this.X
}
public voidsetY(int y){//设置y值
this. y= y
}
public intgetY(){//获取y值
return this.Y;
}
}
public classIntroSpectorTest
{
public staticvoid main(String[] args) throws Exception {
ReflectPointpt1 = new ReflectPoint(3,5);
StringpropertyName = "x";//定义一个我们认为可能是javaBean的属性x(由公有方法可以得出),
//"x"-->"X"-->"getX"-->MethodGetX-->
PropertyDescriptorpd = new PropertyDescriptor(propertyName,pt1.getClass());//创建一个指定类的javaBean属性对象。
MethodmethodGetX = pd.getReadMethod();//获取属性对应的getX方法
Object retVal=methodGetX.invoke(pt1); //执行该方法,用指定的对象去调用该方法,相当于pt1.getX(),
System.out.println(retVal);//创建pt1对象时传入的x值为3,因此打印3
PropertyDescriptorpd2 = new PropertyDescriptor(propertyName,pt1.getClass());
MethodmethodSetX = pd2.getWriteMethod(); //获取setX方法
methodSetX.invoke(pt1,7);执行setX方法,相当于pt1.setX(7);
System.out.println(pt1.getX);//输出7,设置成功。
}
用eclipse将上面的代码读取属性和设置属性的流水账代码分别抽取成方法:
只要调用这个方法,并给这个方法传递一个对象。属性和设置值,它就能完成属性修改的功能。
Object value =7;
private staticvoid setProperties(Object pt1, String propertyName,
Object value) throwsIntrospectionException,
IllegalAccessException,InvocationTargetException {
PropertyDescriptor pd2 = newPropertyDescriptor(propertyName,pt1.getClass());
Method methodSetX =pd2.getWriteMethod();
methodSetX.invoke(pt1,value);
}
private static Object getProperty(Objectpt1, String propertyName)
throwsIntrospectionException, IllegalAccessException,
InvocationTargetException {
PropertyDescriptor pd = newPropertyDescriptor(propertyName,pt1.getClass());
Method methodGetX =pd.getReadMethod();
Object retVal =methodGetX.invoke(pt1);}
采用遍历BeanInfo的所有属性方式来查找和设置某个RefectPoint对 象的X属性。在程序中把一个类当作javabean来看,就是调用IntroSpector.getBeanInfo方法,得到一个BeanInfo对 象,这个对象封装了把这个类当作javabean看的结果信息。
public classIntroSpectorTest
{
public staticvoid main(String[] args) throws Exception
{
ReflectPoint pt1 = newReflectPoint(3,5);
String propertyName ="x";//定义了一个我们认为可能是javaBean的属性x(由公有方法得出)
BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass());//把指定的类当作一个javaBean处理,创建BeanInfo对象封装了把这个类当作javaBean来看的结果信息。
PropertyDescriptor[] pds =beanInfo.getPropertyDescriptors();//得到全部属性返回一个数组。其中一组为[name=x;propertyType=int; readMethod=public int Reflectpoint.getX(); writeMethod=publicvoid Reflectpoint.setX(int)]
表示javabean成员属性x,它的set方法为setX(int),get方法为getX()
Object retVal = null;
for(PropertyDescriptor pd : pds)//遍历该数组,
{
if(pd.getName().equals(propertyName))
{ //如果定义的propertyName与遍历到的javaBean属性相同,获取它的get方法。
Method methodGetX =pd.getReadMethod();//获取该javaBean属性的get方法
retVal = methodGetX.invoke(pt1);//最后执行get方法 获取属性的值。
break;
}
}
}
}
工具包:commoms-beanutils.jar,是第三方工具包
public class ReflectPoint {
privateDate birthday = new Date();//创建Data对象,Data类可以当作javaBean类,Data中有setTime方法。
privateint x;//私有成员变量
publicint y;//私有成员变量
publicReflectPoint(int x, int y) {//带参构造函数
super();
this.x= x;
this.y= y;
}
//setter,getter方法
publicint getX() {
returnx;
}
publicvoid setX(int x) {
this.x= x;
}
publicint getY() {
returny;
}
publicvoid setY(int y) {
this.y= y;
}
publicDate getBirthday() {
returnbirthday;
}
publicvoid setBirthday(Date birthday) {
this.birthday= birthday;
}
}
public classIntroSpectorTest
{
public static void main(String[] args) throwsException
{
ReflectPointpt1 = new ReflectPoint(3,5);//创建javaBean类对象
System.out.println(BeanUtils.getProperty(pt1,"x")); //获取pt1对象javaBean属性x的值,BeanUtils是以字符串的形式操作javaBean的。打印3.
System.out.println(BeanUtils.getProperty(pt1,"x").getClass().getName());//打印java.lang.String,”x”是字符串类型
BeanUtils.setProperty(pt1,"x", "9");//将pt1对象的x值设置为9.
System.out.println(pt1.getX());//打印9
/*
java7的新特性
//map集合可以和javaBean相互转换,BeanUtils提供了转换的方式,map集合中的键相当于javaBean中的属性。因此BeanUtils可以操作map集合
//Map map = {name:"zxx",age:18};// java7的新特性,以键值对的形式直接加进map集合中。即name键的值为”zxx”,age键的值为18.
BeanUtils.setProperty(map, "name", "lhm");// BeanUtils设置map集合name键的值为”lhm”
*/
BeanUtils.setProperty(pt1,"birthday.time", "111");// birthday为javaBean类ReflectPoint类中的javaBean属性,对应的方法为getBirthday。把Data作为javaBean类,即time为Data类中的javaBean属性,对应的方法为setTime方法,相当于pt1.getBirthday().setTime(111)
System.out.println(BeanUtils.getProperty(pt1,"birthday.time")); 打印111
PropertyUtils.setProperty(pt1,"x", 9);// PropertyUtils是以属性本身的类型来操作javaBean
System.out.println(PropertyUtils.getProperty(pt1,"x").getClass().getName());//Integer
}
}