黑马程序员-java-JavaBean

---------------------- android培训、 java培训、期待与您交流! ----------------------

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

你可能感兴趣的:(黑马程序员-java-JavaBean)