黑马程序员——高新技术--JavaBean

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

JavaBean与内省:

JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。

JavaBean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。如果方法名为setId,中文意思即为设置id,至于你设置的是哪个变量,则不用管。如果方法名为getId,中文意思即为获取id,至于你从哪个变量上取,也不用管。去掉set前缀,剩余部分就是属性名,如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小的。

例如:
- setId()的属性名:id
- isLast()的属性名:last
- setCPU的属性名:CPU
- getUPS的属性名:UPS
一个符合JavaBean特点的类可以当作普通类一样进行使用

好处:
JDK中提供了对JavaBean进行操作的一些API,这套API就称为内省。如果要你自己去通过getX方法来访问私有的x,就有一定的难度。用内省这套api操作JavaBean比用普通类的方式更方便。

如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object,简称VO)。这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问。

符合JavaBean特点的类:

public class ReflectPoint {

      //创建私有属性
      private int x ;
      private int y ;

      public ReflectPoint(int x, int y) {
            super();
            this.x = x;
            this.y = y;
      }

      //x属性的set方法及get方法
      public int getX() {
             return x ;
      }
      public void setX(int x) {
             this.x = x;
      }

      //y属性的set方法及get方法
      public int getY() {
             return y ;
      }
      public void setY(int y) {
             this.y = y;
      }
}

简单内省操作:

import java.beans.*;
import java.lang.reflect.*;

public class ReflectTest {

     public static void main(String[] args) throws Exception {

         //创建一个对象
         ReflectPoint pt1 = new ReflectPoint(3, 5);

         //确定对象中的属性名
         String propertyName = "x";

         //通过属性名及Class类获取属性描述对象
         PropertyDescriptor pd1 = new PropertyDescriptor(propertyName, pt1.getClass());

         //通过该属性描述对象可以获取该属性名的get方法
         Method readMethod = pd1.getReadMethod();

         //调用get方法获得该方法的返回值
         Object retVal = readMethod.invoke(pt1);

         System. out.println(retVal);//结果为3

        //获取set方法
        Method writeMethod = pd2.getWriteMethod();
        //调用set方法,传入参数7
        writeMethod.invoke(pt1,7);
        System. out.println(pt1.getX());  //结果为7
    }
}

复杂内省操作:

import java.beans.*;
import java.lang.reflect.*;

public class ReflectTest {

     public static void main(String[] args) throws Exception {

         ReflectPoint pt1 = new ReflectPoint(3, 5);

         //BeanInfo对象封装了JavaBean类的结果信息
         BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass());

         //通过BeanInfo的方法获取JavaBean类的所有属性集合
         PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();

         //确定要操作的属性名
         String propertyName = "x";

         //创建参数对象
         Object value = 7;

         //遍历该集合获取想要的属性
         for (PropertyDescriptor pd : pds){
                if (pd.getName().equals(propertyName)){

                     //通过属性获得该属性的write方法
                     Method writeMethod = pd.getWriteMethod();

                     //传入参数并调用该方法
                     writeMethod.invoke(pt1,value);
               }
         }
         System. out.println(pt1.getX());  //结果为7
    }

}

BeanUtils工具包:

BeanUtils工具包的由来:
Sun公司的内省API过于繁琐,所以Apache组织结合很多实际开发中的应用场景开发了一套简单、易用的API操作Bean的属性——BeanUtils,在Beanutil中可以直接进行类型的自动转换。

BeanUtils工具包还用到了日志包,那么我们在使用的时候把BeanUtils工具包跟日志包放进工程里面,那么在类中import这个包就可以使用里面的方法了

import org.apache.commons.beanutils.BeanUtils;

public class ReflectTest {

       public static void main(String[] args) throws Exception {
         ReflectPoint pt1 = new ReflectPoint(3, 5);

         //直接用BeanUtils工具包里面的getProperty方法传入类名跟属性名就可以的到该属性的get方法的返回值
         System. out.println(BeanUtils.getProperty(pt1, "x"));

         //使用BeanUtils工具包的setProperty方法设置属性的值
         BeanUtils. setProperty(pt1, "x", "7");
         System. out.println(pt1.getX());
       }
}

注意:

  1. BeanUtils工具类在对对象的属性进行操作的时候,会自动进行类型转换。例如ReflectPoint类中的x属性为int类型,但是设置属性值的时候传入的参数却可以是String类型,这是因为内部发生了自动类型转换。

  2. BeanUtils工具类可以对属性进行级联操作,例如Date(java.util.Date)类中有setTime方法,那么也就相当于Date类型对象有一个time属性,BeanUtils就可以对其进行操作。

import java.util.Date;

public class ReflectPoint {
       private int x ;
       private Date birthday = new Date();

       public int getX() {
             return x ;
      }

       public void setX(int x) {
             this.x = x;
      }

      public Date getBirthday() {
             return birthday ;
      }

       public void setBirthday(Date birthday) {
             this.birthday = birthday;
      }

}
public class ReflectTest {
       public static void main(String[] args) throws Exception {
         ReflectPoint pt1 = new ReflectPoint(3, 5);

         //支持级联操作
         BeanUtils. setProperty(pt1, "birthday.time", "111");

         System. out.println(BeanUtils.getProperty(pt1, "birthday.time" ));//结果:111
       }
}
  • 3.PropertyUtils类也可以操作对象的属性,但是与BeanUtils不同的是它不能进行自动类型转换。
    例如ReflectPoint类中的x属性为int类型,但是设置属性值的时候传入的参数就不可以是String类型。

其他方法:
copyProperty():复制属性值
describe():把一个属性转换成一个Map
populate():把一个Map填充到JavaBean里面去

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值