JavaBean是一种特殊的java类,主要用于传递数据信息。
如果要在两个模块之间传递信息,都是把这些信息封装成JavaBean对象来传递的,这种对象称为值对象(VO).
一个标准的JavaBean有下面几个特性:
JavaBean是一个public类;
JavaBean有一个不带参数的构造方法;
JavaBean通过setXXX方法设置属性,通过getXXX方法获取属性
JavaBean的属性是根据其中的set和get方法来确定的,而不是根据其中的成员变量。
如果第二个字母是小的,则把第一个字母变成小的:Age-->age
gettime-->time
setTime-->time
getCPU-->CPU
一个符合JavaBean特点的类可以当作普通类一样处理,但是把它当作JavaBean处理肯定会带来一些好处,
所以我们才会去了解和应用JavaBean.
JDK提供了对JavaBean进行操作的一些API,这套API就称为内省,用内省操作JavaBean类比较方便。
如得到一个对象中私有的属性x,用普通的反射比较复杂,用JavaBean内省处理就比较简单,
通过属性描述符PropertyDescriptor,看例子:
public class Point
{
private int x;
private int y;
private Date date = new Date();
public Date getDate()
{
return date;
}
public void setDate(Date date)
{
this.date = date;
}
public Point(int x,int y)
{
this.x = x;
this.y = y;
}
public int getX()
{
return x;
}
public void setX(int x)
{
this.x = x;
}
public int getY()
{
return y;
}
public void setY(int y)
{
this.y = y;
}
}
上面程序中定义了一个Point类,有x,y,date三个属性,分别都设置了set和get方法。
package com.bean;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;
public class PointTest
{
public static void main(String[] args) throws Exception
{
Point point = new Point(3, 5);
String propertyName = "x";
Object retVal = getProperty(point, propertyName);
System.out.println(retVal);
System.out.println(BeanUtils.getProperty(point, "x"));
System.out.println(BeanUtils.getProperty(point, "x").getClass().getName());
BeanUtils.setProperty(point, "x", "10");
System.out.println("bean set " + point.getX());
BeanUtils.setProperty(point, "date.time", "1000");
System.out.println("date ::" + point.getDate());
System.out.println("date time "+ BeanUtils.getProperty(point, "date.time"));
PropertyUtils.setProperty(point, "x", 9);
System.out.println(PropertyUtils.getProperty(point, "x").getClass().getName());
int value = 10;
setProperty(point, propertyName, value);
System.out.println(point.getX());
}
private static void setProperty(Object obj, String propertyName, int value)
throws IntrospectionException, IllegalAccessException,
InvocationTargetException
{
PropertyDescriptor pd2 = new PropertyDescriptor(propertyName, obj
.getClass());
Method methodSetX = pd2.getWriteMethod();
methodSetX.invoke(obj, value);
}
private static Object getProperty(Object obj, String propertyName)
throws IntrospectionException, IllegalAccessException,
InvocationTargetException
{
PropertyDescriptor pd = new PropertyDescriptor(propertyName, obj
.getClass());
Method methodGetX = pd.getReadMethod();
Object retVal = methodGetX.invoke(obj);
// BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
// PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
// Object retVal = null;
// for (PropertyDescriptor pd : pds)
// {
// if (pd.getName().equals(propertyName))
// {
// Method methodGetX = pd.getReadMethod();
// retVal = methodGetX.invoke(obj);
// break;
// }
// }
return retVal;
}
}
上面程序打印:
3
3
java.lang.String
bean set 10
date ::Thu Jan 01 08:00:01 CST 1970
date time 1000
java.lang.Integer
10
程序中,new了一个point对象,传入x,y的值为3,5.
getProperty(Object obj, String propertyName)方法接受对象引用,和属性名,
通过属性描述PropertyDescriptor和反射得到x的值。
也可通过开源大师们的BeanUtils工具包的getProperty得到point对象的x属性,
使用BeanUtils工具包需要导入commons-beanutils和commons-logging两个jar文件。
注意,BeanUtils把属性当作字符串处理,看结果第三行输出java.lang.String,属性x
为int类型。
由于Date类有一个setTime方法,BeanUtils把Date类当作JavaBean来看,认为Date对象里有一个time属性,
可见,BeanUtils支持属性的级联操作。
BeanUtils通过setProperty(point, "date.time", "1000")设置time属性值1000,
看打印结果第5行设置了时间1秒。
BeanUtils还可以把JavaBean转成Map,把Map里面的值填充到JavaBean里面,Map的key
相当于JavaBean的属性,BeanUtils工具包非常有用。
JDK内省还有一个PropertyUtils工具类,PropertyUtils以属性本身的类型进行操作,
PropertyUtils.setProperty(point, "x", 9)
看第七行打印java.lang.Integer,返回的属性的Class类型。
getProperty方法下面注释的部分是采用遍历BeanInfo的所有属性方式来查找和设置某个JavaBean对象的x属性。
BeanInfo对象封装了把类当作JavaBean看的结果信息。
JavaBean就学习介绍到这了,谢谢。
---------------------- android培训、 java培训、期待与您交流! ----------------------详细请查看: http://edu.csdn.net/heima