JAVABean的内省操作

一,简单内省操作

1.定义PropertyDescriptor 类的对象pdnew的时候传入属性名字,Class

2.pd调用getReadMethod.返回值是Method类型

3.Method调用invoke方法执行

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package cn.itcast.pro;  
  2.   
  3. import java.beans.PropertyDescriptor;  
  4. import java.lang.reflect.Method;  
  5.   
  6. import cn.itcast.person.Person;  
  7.   
  8. public class Demo_JavaBean {  
  9.   
  10.     /** 
  11.      * javabean的简单内省操作 
  12.      * @param args 
  13.      * @throws Exception  
  14.      */  
  15.     public static void main(String[] args) throws Exception {  
  16.         Person p1=new Person("张三",10);  
  17.         String propertyName="name";     //要获取的属性名  
  18.         //定义属性描述类,参数1是属性名字,参数2是Class  
  19.         PropertyDescriptor pd=new PropertyDescriptor(propertyName, p1.getClass());  
  20.         //获得读取属性的方法  
  21.         Method method1=pd.getReadMethod();  
  22.         //执行并打印  
  23.         System.out.println(method1.invoke(p1));  
  24.           
  25.         Method method2=pd.getWriteMethod();//获得写入属性值的方法  
  26.         method2.invoke(p1, "李四");  
  27.         System.out.println(p1.getName());  
  28.           
  29.     }  
  30.   
  31. }  


 

二,复杂内省操作

1.Introspector类直接调用方法getBeanInfo得到一个BeanInfo 类的对象bif

getBeanInfo方法参数传入p2.class

2.BeanInfo的对象bif调用getPropertyDescriptors方法得到p2的所有属性组成的数组PropertyDescriptor[] pds

3.遍历这个数组,每个数组值调用getName()方法得到每个属性的名字,如果和指定的名字相同,就Method method=propertyDescriptor.getReadMethod();然后执行这个方法

 

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package cn.itcast.pro;  
  2.   
  3. import java.beans.BeanInfo;  
  4. import java.beans.IntrospectionException;  
  5. import java.beans.Introspector;  
  6. import java.beans.PropertyDescriptor;  
  7. import java.lang.reflect.InvocationTargetException;  
  8. import java.lang.reflect.Method;  
  9.   
  10. import cn.itcast.person.Person;  
  11.   
  12. public class Demo_JavaBean2 {  
  13.   
  14.     /** 
  15.      * JavaBean的复杂内省操作 
  16.      * @param args 
  17.      * @throws InvocationTargetException  
  18.      * @throws IllegalArgumentException  
  19.      * @throws IllegalAccessException  
  20.      */  
  21.     public static void main(String[] args) throws IntrospectionException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {  
  22.         Person p2=new Person("张三",12);  
  23.         String propertyName="name";  
  24.           
  25.         //Introspector 类为通过工具学习有关受目标 Java Bean 支持的  
  26.         //属性、事件和方法的知识提供了一个标准方法。   
  27.         BeanInfo bif=Introspector.getBeanInfo(p2.getClass());  
  28.           
  29.         PropertyDescriptor[] pds=bif.getPropertyDescriptors();  
  30.         for (PropertyDescriptor propertyDescriptor : pds) {  
  31.             if(propertyDescriptor.getName().equals(propertyName)){  
  32.                 Method method=propertyDescriptor.getReadMethod();  
  33.         //      System.out.println(method.invoke(p2));  
  34.                 Object retVal=method.invoke(p2);  
  35.                   
  36.                 System.out.println(retVal);  
  37.                 break;  
  38.                   
  39.                 }  
  40.             }  
  41.     }  
  42.   
  43. }  


 

三.使用BeanUtils包工具包操作JavaBean

 一.导入BeanUtils

1. commons-beanutils.jar  ==  commons-beanutils-bean-collections.jar + commons-beanutils-core.jar   所以导包只要导入commons-beanutils.jar就行了。

2. 在工程中,新建一个文件夹,名字叫lib,在lib里存入commons-beanutils.jar,然后,右键点击文件commons-beanutils.jar,选择Build Path------>Add to Build Path

3. 如果这个时候运行,会报错。java.lang.NoclassDefFoundError: org/apache/commons/logging/LogFactory  。由于commons-beanutils.jar运行,需要用到另一个jar包,我们没有导入,所以会报错。  导入org/apache/commons/logging 包, commons-logging-1.1.jar  也放到lib文件夹中,操作步骤和2相同。

4. 这个时候我们可以用BeanUtils工具包了。

 二.操作

1.简单操作

   BeanUtils.getProperty(p1,name);//p1是Person类的对象,name是属性

BeanUtils.setProperty(p1,age,20); //设置p1对象的age属性的值是20.  

      这里要注意,传入的参数,只能是字符串,BeanUtils工具包会把这个字符串转成程序需要的类型。

2.级联操作

BeanUtils包支持对属性的级联操作。例如我们有一个类,这个类中有一个私有属性,类型的Date  

 

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class Person implements Comparable<Person>,Serializable{  
  2.     /** 
  3.      *  
  4.      */  
  5.     private static final long serialVersionUID = 1L;  
  6.     public Date getBirthday() {  
  7.         return birthday;  
  8.     }  
  9.     public void setBirthday(Date birthday) {  
  10.         this.birthday = birthday;  
  11.     }  
  12. }  

 

通过查API,我们发现Date类对象,也有一个setTime方法,public void setTime (long time)所以,也相当于javabean,我们可以认为Date类有一个属性叫time

下面我们来对birthday属性进行级联操作。

BeanUtils.setProperty(p1,birthday.time,12345);

运行后,会有报错: java.lang.IllegelArgumentExcetion: No bean specified (没有指定bean)

原因是我们的birthday没有赋初值。 修改代码为private Date birthday=new Date();

BeanUtils.getProperty(p1,birthday.time);

2.BeanUtils包其他方法

static void copyProperties(java.lang.Object dest, java.lang.Object orig );

//把一个对象的属性拷贝到另一个对象的属性上

static java.util.Map  describe(java.lang.Object bean ) 

//把一个javabean转换成Map集合,这个方法参数是一个对象。比如传入p (一个Person类对象),Map 集合的键是属性名,值是属性值。

static void populate (java.lang.Object  bean ,   java.util.Map.properties)

//把一个Map集合,封装成javabean

3.PropertyUtils  

这个类也有set方法。

propertyUtils.setProperty(p,age,20);  //设置page属性是20

这里要注意propertyUtilsBeanUtils的区别,propertyUtils的参数是20,也就是age自己的类型int,而BeanUtils 参数是字符串

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值