黑马程序员--java基础加强之内省(IntroSpector)

一、JavaBean

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

           2、如果要在两个模块儿中传递多个信息,可以将这些信息封装到JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object,简称VO)

                这些信息在类中用私有字段来存储,如果读取或设置这些信息,需要通过相应的方法来访问。这些方法通常是get和set。

                所以JavaBean的属性是根据getter和setter方法来确定的,而不是根据其中的成员变量。它将get或set方法的前缀去掉,保留后面的字段作为自己的属性名。

                比如:getId>属性名就是CPU。

           3、JDk中对JavaBean的操作提供了一些API,这套API就叫做内省。

需求:用JavaBean的内省获取Test类中的私有成员变量x,y

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
//定义一个测试类
class Test{
    private int x;   
    private int 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;
    }
    public Test(int x, int y) {
        super();
        this.x = x;
        this.y = y;
    }  
}
 
public class Introspector {
    private static String x;
 
    public static void main(String[] args) throws Exception {
        //创建Test对象
        Test test = new Test(3,5);
        //将要获取的变量封装成对象
        String propertyName = "x";
        //调用获取方法
        getProperty(test, propertyName);       
        
        //定义需要设置后的变量
        Object value = 7;
        setProperty(test, propertyName, value);
        System.out.println(test.getX());
    }
//自定义设置变量的方法,需要传入对象名,变量名,设置后的值
    private static void setProperty(Object obj, String propertyName, Object value)
            throws IntrospectionException, IllegalAccessException,
            InvocationTargetException {
        //创建属性描述对象,传入变量名,变量名所在的类
        PropertyDescriptor pd1 = new PropertyDescriptor(propertyName, obj.getClass());
        //获取方法
        Method methodSetX = pd1.getWriteMethod();
        //操作方法
        methodSetX.invoke(obj, value);
    }
 
    private static void getProperty(Object obj, String propertyName)
            throws IntrospectionException, IllegalAccessException,
            InvocationTargetException {
        PropertyDescriptor pd = new PropertyDescriptor(propertyName, obj.getClass());
        Method methodGetX = pd.getReadMethod();
        //操作方法,得到返回的值。因为get方法不需要参数,所以该处只需要传入对象名即可
        Object retVal = methodGetX.invoke(obj);
        System.out.println(retVal);
    }
}

二、Beanutils工具包

          1、因为JavaBean的使用频率很高,所以Apache就提供了beanutils工具包来对JavaBean进行操作。

          2、需要从Apache官网下载工具包和日志包logging.jar。

          3、利用工具包提供的方法来获取上个事例的变量就会很方便,只需要一部。

                BeanUtils.getProperty(对象,"变量名");

                BeanUtils.setProperty(对象,"变量名","值(这里是字符串)");

               也可以PropertyUtils.setProperty(对象,"变量名",实际类型);

               这两者区别就是最后面的参数不同。

 

 

posted @ 2013-04-08 22:21  郭彦君  阅读(209)  评论(0编辑  收藏  举报