內(nèi)省(Introspector) 是Java 語言對 JavaBean 類屬性、事件的一種缺省處理方法。說簡單一點就是操作JavaBean的一套API。
什么是JavaBean?
javaBean只是一種規(guī)范,大家都按照約定好的一套規(guī)則寫java類,既然是規(guī)范就有一定的要求:
- 類是public的,然后有個無參的構(gòu)造函數(shù)
- 屬性是private的,通過設(shè)置setXXX()和getXXX()來訪問
- 能支持事件,例如 addXXXXListener(XXXEvent e), 事件可以是 Click 事件,Keyboard 事件等等
- 提供應(yīng)該 反射機制,這樣可以查看java bean的各種信息
- 可以序列化,可以保存在硬盤上
例如:
public class User {
private String name;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
JDK內(nèi)省類庫
PropertyDescriptor類:
PropertyDescriptor可以獲取某一個具體的屬性。主要的方法有:
- getPropertyType(),獲得屬性的Class對象;
- getReadMethod(),獲得用于讀取屬性值的方法,例如getXXX()方法;
- getWriteMethod(),獲得用于寫入屬性值的方法,例如setXXX()方法;
- hashCode(),獲取對象的哈希值;
- setReadMethod(Method readMethod),設(shè)置用于讀取屬性值的方法;
- setWriteMethod(Method writeMethod),設(shè)置用于寫入屬性值的方法。
示例代碼:
public class JavaBeanUtils {
public static void main(String[] args) throws IntrospectionException {
User user = new User();
PropertyDescriptor propertyDescriptor = new PropertyDescriptor("name",user.getClass());
System.out.println(propertyDescriptor.getPropertyType());
Method method = propertyDescriptor.getReadMethod();
System.out.println(method.getName());
method = propertyDescriptor.getWriteMethod();
System.out.println(method.getName());
}
}
輸入結(jié)果:
class java.lang.String
getName
setName
Introspector類:
Introspector可以按照JavaBean的規(guī)范將一個類封裝成BeanInfo對象。通過調(diào)用getPropertyDescriptors()方法會返回一個包含所有屬性的PropertyDescriptor對象數(shù)組,通過PropertyDescriptor可以操作類的屬性。
具體代碼如下:
public class JavaBeanUtils {
public static void main(String[] args) throws IntrospectionException {
BeanInfo beanInfo = Introspector.getBeanInfo(User.class);
PropertyDescriptor[] pd = beanInfo.getPropertyDescriptors();
//迭代每一個描述器
for (PropertyDescriptor propertyDescriptor : pd) {
System.out.println("屬性名 :"+propertyDescriptor.getName());
System.out.println("setter :"+propertyDescriptor.getWriteMethod());
System.out.println("getter :"+propertyDescriptor.getReadMethod());
}
}
}