黑马程序员技术交流社区

标题: 如何理解内省啊,真难啊 [打印本页]

作者: 李晓俊老师    时间: 2012-3-2 20:09
标题: 如何理解内省啊,真难啊
看了张孝祥老师的高新技术部分,还是不太懂内省啊,感觉就像是一种通用了的模式
作者: 田啸    时间: 2012-3-2 20:31
内省是 Java 语言对 Bean 类属性、事件的一种缺省处理方法。我可以通过getter/setter访问,设置类中的属性。 Java 中提供了一套 API 用来访问某个属性的 getter/setter 方法,,这些 API 存放于包 java.beans 中。

 一般的做法是通过类 Introspector 来获取某个对象的 BeanInfo 信息,然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor ),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后我们就可以通过反射机制来调用这些方法。

Java代码 1.package com.tc.test;  
2.  
3.  
4.import java.beans.BeanInfo;  
5.  
6.import java.beans.IntrospectionException;  
7.  
8.import java.beans.PropertyDescriptor;  
9.  
10.  
11.public class Introspector {  
12.  
13.    private String name;  
14.  
15.    private Integer age;  
16.  
17.  
18.    public String getName() {  
19.  
20.       return name;  
21.  
22.    }  
23.  
24.  
25.    public void setName(String name) {  
26.  
27.       this.name = name;  
28.  
29.    }  
30.  
31.  
32.    public Integer getAge() {  
33.  
34.       return age;  
35.  
36.    }  
37.  
38.  
39.    public void setAge(Integer age) {  
40.  
41.       this.age = age;  
42.  
43.    }  
44.  
45.  
46.    public Introspector(String name, Integer age) {  
47.  
48.       this.name = name;  
49.  
50.       this.age = age;  
51.  
52.    }  
53.  
54.  
55.    public static void main(String[] args) {  
56.  
57.       Object object = new Introspector("hjz", 180);  
58.  
59.       try {  
60.  
61.           // getBeanInfo方法有三个重载,用法见API  
62.  
63.           BeanInfo beanInfo =  java.beans.Introspector.getBeanInfo(object.getClass(), Object.class);  
64.  
65.            
66.  
67.           // 遍历属性  
68.  
69.           PropertyDescriptor[] descriptors = beanInfo.getPropertyDescriptors();  
70.  
71.           for (PropertyDescriptor propertyDescriptor : descriptors) {  
72.  
73.              System.out.println(propertyDescriptor.getName());  
74.  
75.           }  
76.  
77.            
78.  
79.           // 读写属性  
80.  
81.           for (PropertyDescriptor propertyDescriptor : descriptors) {  
82.  
83.              try {  
84.  
85.                  System.out.println(propertyDescriptor.getReadMethod().invoke(object, null));  
86.  
87.                  System.out.println(propertyDescriptor.getWriteMethod().getName());  
88.  
89.              } catch (Exception e) {  
90.  
91.                  e.printStackTrace();  
92.  
93.              }  
94.  
95.           }  
96.  
97.       } catch (IntrospectionException e) {  
98.  
99.           e.printStackTrace();  
100.  
101.       }  
102.  
103.    }  
104.  
105.}  
对一个 Bean 类来讲,可以没有属性,但是只要有 getter/setter 方法中的其中一个,那么 Java 的内省机制就会认为存在一个属性,比如类中有方法 setMobile ,那么就认为存在一个 mobile 的属性,这样可以方便我们把 Bean 类通过一个接口来定义而不用去关心具体实现,不用去关心 Bean 中数据的存储。比如我们可以把所有的 getter/setter 方法放到接口里定义,但是真正数据的存取则是在具体类中去实现,这样可提高系统的扩展性。

作者: 杨盼    时间: 2012-3-2 20:36
内省就是一套API,这也不算什么通用模式,只是在进行某项操作时常用的类而已。你可以通过反射来获取setter和getter方法很麻烦,所以有了这样一套API简化操作,比如你要格式化一个日期,你可以自己写,也可以调用已知的类。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2