黑马程序员-内省、操作JavaBean工具类

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

内省:

  主要作用就是对JavaBean进行操作。

  JavaBean:

    特殊的Java类,对属性进行过封装,把属性私有化,每个属性都有public修饰的get ,set方法。

    JavaBean是Java类,而Java类不一定都是JavaBean。

    JavaBean主要用于传递数据信息,比如在两个模块之间传递多个信息,就可以把这些信息封装到一个JavaBean中,这种JavaBean的实例对象被称之为值对象(Value Object,简称VO)。

内省操作:

  简单操作:

    创建一个PropertyDescriptor的实例对象,给构造方法中传入属性名,该属性名所在的类的字节码文件。然后根据创建的PropertyDescriptor实例对象的getReadMethod()、getWriteMethod(),获取该属性的get方法和set方法。接下来就是反射的操作了,用获得的get、set方法的invoke方法作用与某个对象。

  复杂操作:

    通过Introspector.getBeanInfo(),传入要操作的类的字节码文件,返回一个BeanInfo对象,通过BeanInfo对象的getPropertyDescriptors方法获得要操作的类的所有属性,然后进行循环比较,获得要找的属性的get、set方法。

 1 package test.enhance.introspector;
 2 
 3 import java.beans.BeanInfo;
 4 import java.beans.MethodDescriptor;
 5 import java.beans.PropertyDescriptor;
 6 import java.lang.reflect.Method;
 7 
 8 import cn.itcst.day1.ReflectPoint;
 9 
10 public class Introspector {
11 
12     /**
13      * @param args
14      */
15     public static void main(String[] args) throws Exception {
16         // TODO Auto-generated method stub
17         
18         //--------------------内省简单操作
19         String name = "x";
20         //用内省的方式获得该类的属性x
21         PropertyDescriptor pd = new PropertyDescriptor(name,ReflectPoint.class);
22         
23         //根据属性获得该属性的get方法
24         Method methodGetX = pd.getReadMethod();
25         
26         ReflectPoint rp = new ReflectPoint(1,2);
27         
28         //用该属性的get方法作用于对象
29         System.out.println(methodGetX.invoke(rp));
30         
31         
32         //获取set方法
33         Method methodSetX = pd.getWriteMethod();
34         methodSetX.invoke(rp, 100);
35         
36         System.out.println(rp.getX());
37         
38         //------------------内省复杂操作
39         //根据Introspector.getBeanInfo()获得一个BeanInfo
40         BeanInfo beanInfo =  java.beans.Introspector.getBeanInfo(ReflectPoint.class);
41         //获得该类中所有的方法
42         PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
43         
44         for(PropertyDescriptor  prod : pds){
45             //如果该属性名字与传入的名字相同
46             if(prod.getName().equals(name)){
47                 Method mdGetX = prod.getReadMethod();
48                 System.out.println(mdGetX.invoke(rp));
49                 break;
50             }
51         }
52         //获得类的所有方法,构造函数不在内。
53         MethodDescriptor[] mds = beanInfo.getMethodDescriptors();
54         for(MethodDescriptor md : mds){
55             System.out.println(md.getName());
56         }    
57     }
58 
59 
60 
61 }

由于对JavaBean的操作比较频繁,而用内省的方式呢又比较麻烦,所有开源勇士们就弄了一个工具包出来专门操作JavaBean,

首先要使用必须导入两个jar包,commons-beanutils.jar和commons-logging-1.1.1.jar

  BeanUtils类:

    设置属性:BeanUtils.setProperty(); 需要传入要操作的对象,那个属性,值

    获得属性:BeanUtils.getProperty();需要传入要操作的对象,哪个属性

    需要注意的是:BeanUtils类在设置值和取出值的时候都转换为了String类型,也就是说在传入和取出的时候都不能用原始类型。

  PropertyUtils类:

    设置属性:PropertyUtils.setProperty();

    获得属性:PropertyUtils.getProperty();

    PropertyUtils的用法是和BeanUtils一样的,唯一不懂的是PropertyUtils保留了传入和取出值的原有数据类型,这个一点要注意。

    

 1         //-------------BeanUtils工具类
 2         //setProperty()设置属性值
 3         //BeanUtils类会把设置和取出的值都转换为String类型。
 4         BeanUtils.setProperty(rp, "x", "999");
 5         
 6         //getProperty(); 获得rp的属性x的值
 7         int x = Integer.parseInt(BeanUtils.getProperty(rp, "x"));
 8         System.out.println("用BeanUtils工具获得的X : " + x);
 9         
10     
11         //PropertyUtils类,不会把值转换为String类型。保持原有类型。
12         PropertyUtils.setProperty(rp, "x", 888);
13         //取值
14         int proX = (Integer)PropertyUtils.getProperty(rp, "x");
15         System.out.println("用PropertyUtils工具获得的X : " + proX);
16         
17         //支持级联操作
18         BeanUtils.setProperty(rp, "birthday.time", 111);
19         System.out.println(PropertyUtils.getProperty(rp, "birthday.time"));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值