A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李晓俊老师 黑马帝   /  2012-3-2 20:09  /  1828 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

看了张孝祥老师的高新技术部分,还是不太懂内省啊,感觉就像是一种通用了的模式

2 个回复

正序浏览
内省就是一套API,这也不算什么通用模式,只是在进行某项操作时常用的类而已。你可以通过反射来获取setter和getter方法很麻烦,所以有了这样一套API简化操作,比如你要格式化一个日期,你可以自己写,也可以调用已知的类。
回复 使用道具 举报
内省是 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 方法放到接口里定义,但是真正数据的存取则是在具体类中去实现,这样可提高系统的扩展性。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马