内省是 Java 语言对 Bean 类属性、事件的一种缺省处理方法。我可以通过getter/setter访问,设置类中的属性。 Java 中提供了一套 API 用来访问某个属性的 getter/setter 方法,,这些 API 存放于包 java.beans 中。
一般的做法是通过类 Introspector 来获取某个对象的 BeanInfo 信息,然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor ),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后我们就可以通过反射机制来调用这些方法。
package com.tc.test;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
public class Introspector {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Introspector(String name, Integer age) {
this.name = name;
this.age = age;
}
public static void main(String[] args) {
Object object = new Introspector("hjz", 180);
try {
// getBeanInfo方法有三个重载,用法见API
BeanInfo beanInfo = java.beans.Introspector.getBeanInfo(object.getClass(), Object.class);
// 遍历属性
PropertyDescriptor[] descriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor propertyDescriptor : descriptors) {
System.out.println(propertyDescriptor.getName());
}
// 读写属性
for (PropertyDescriptor propertyDescriptor : descriptors) {
try {
System.out.println(propertyDescriptor.getReadMethod().invoke(object, null));
System.out.println(propertyDescriptor.getWriteMethod().getName());
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (IntrospectionException e) {
e.printStackTrace();
}
}
}
对一个 Bean 类来讲,可以没有属性,但是只要有 getter/setter 方法中的其中一个,那么 Java 的内省机制就会认为存在一个属性,比如类中有方法 setMobile ,那么就认为存在一个 mobile 的属性,这样可以方便我们把 Bean 类通过一个接口来定义而不用去关心具体实现,不用去关心 Bean 中数据的存储。比如我们可以把所有的 getter/setter 方法放到接口里定义,但是真正数据的存取则是在具体类中去实现,这样可提高系统的扩展性。