内省是 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 方法放到接口里定义,但是真正数据的存取则是在具体类中去实现,这样可提高系统的扩展性。
|