您的位置:首页 > 职场人生

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

2013-03-08 12:45 369 查看
------- 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"));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: