内省(Introspector) 是Java 语言对 JavaBean 类属性、事件的一种缺省处理方法,是基于反射技术延伸出的一套api。
JavaBean是一种特殊的类,主要用于传递数据信息。
- 拥有无参构造器
- 所有属性私有,
- 所有属性提供get、set方法
- 实现了序列化接口
这种类, 我们称其为 bean类。
Java提供了一套java.beans包的api , 对于反射的操作, 进行了封装,即内省。
下面我们对这些api进行介绍。
Introspector类——获取bean类信息
getBeanInfo方法:通过传入的类信息,
得到这个
Bean
类的封装对象 。
BeanInfo getBeanInfo(Class c);
BeanInfo类
getPropertyDescriptors方法:返回获取bean类的get、set方法的数组
MethodDescriptor[] getPropertyDescriptors();
MethodDescriptor类
getReadMethod方法:获取一个get方法
Method getReadMethod();
getWriteMethod方法:获取一个set方法
Method getWriteMethod();
注意:有可能返回null,记得加判断。
示例:
public class Expressage implements Serializable {
private String number;
private String name;
private String phoneNumber;
private String address;
public Expressage() {
}
public Expressage(String number, String name, String phoneNumber, String address) {
this.number = number;
this.name = name;
this.phoneNumber = phoneNumber;
this.address = address;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Expressage{" +
"number='" + number + '\'' +
", name='" + name + '\'' +
", phoneNumber='" + phoneNumber + '\'' +
", address='" + address + '\'' +
'}';
}
}
//获取类对象
Class c = Expressage.class;
//获取bean类的信息
BeanInfo bi = Introspector.getBeanInfo(c);
//获取所有属性的数组
PropertyDescriptor[] pds = bi.getPropertyDescriptors();
for (PropertyDescriptor pd:pds) {
//获得属性的get、set方法
Method get = pd.getReadMethod();
Method set = pd.getWriteMethod();
}