概述
經(jīng)常需要使用java對象的屬性來封裝程序的數(shù)據(jù)懈凹,每次都使用反射技術(shù)完成此類操作過于麻煩腻格,所以sun公司開發(fā)了一套API,專門用于操作java對象的屬性偏塞。
內(nèi)省(IntroSpector)是Java語言對JavaBean 類屬性、事件的一種處理方法钉答。 例如類A中有屬性name,那我們可以通過getName,setName 來得到其值或者設(shè)置新的值础芍。 通過getName/setName 來訪問name屬性,這就是默認的規(guī)則数尿。
Java中提供了一套API 用來訪問某個屬性的getter/setter方法仑性,通過這些API可以使你不需要了解這個規(guī)則,這些API存放于包java.beans 中右蹦。
一般的做法是通過類Introspector的getBeanInfo方法獲取某個對象的BeanInfo信息,然后通過BeanInfo來獲取屬性的描述器(PropertyDescriptor),通過這個屬性描述器就可以獲取某個屬性對應(yīng)的getter/setter方法,然后我們就可以通過反射機制來調(diào)用這些方法诊杆。
我們又通常把javabean的實例對象稱之為值對象,因為這些bean中通常只有一些信息字段和存儲方法何陆,沒有功能性方法晨汹。
一個JavaBean類可以不當JavaBean用,而當成普通類用贷盲。JavaBean實際就是一種規(guī)范淘这,當一個類滿足這個規(guī)范,這個類就能被其它特定的類調(diào)用巩剖。一個類被當作javaBean使用時铝穷,JavaBean的屬性是根據(jù)方法名推斷出來的,它根本看不到j(luò)ava類內(nèi)部的成員變量球及。去掉set前綴氧骤,然后取剩余部分呻疹,如果剩余部分的第二個字母是小寫的吃引,則把剩余部分的首字母改成小的。
內(nèi)省訪問JavaBean有兩種方法:
- 通過PropertyDescriptor來操作Bean對象
public static void demo1() throws Exception {
User user = new User("zhangsan", 21);
String propertyName = "name";
// 直接指定要訪問的屬性
PropertyDescriptor pd = new PropertyDescriptor(propertyName, user.getClass());
// 獲取到讀方法
Method readMethod = pd.getReadMethod();
// 反射機制調(diào)用
Object invoke = readMethod.invoke(user, null);
System.out.println("名字:" + invoke);
pd.getWriteMethod().invoke(user, "lisi");
invoke = readMethod.invoke(user, null);
System.out.println("名字:" + invoke);
}
}
- 通過Introspector類獲得Bean對象的 BeanInfo刽锤,然后通過 BeanInfo 來獲取屬性的描述器( PropertyDescriptor )镊尺,通過這個屬性描述器就可以獲取某個屬性對應(yīng)的 getter/setter 方法,然后通過反射機制來調(diào)用這些方法并思。
public static void demo2() throws Exception {
// 獲取整個Bean的信息
// BeanInfo beanInfo= Introspector.getBeanInfo(user.getClass());
// 在Object類時候停止檢索庐氮,可以選擇在任意一個父類停止
BeanInfo beanInfo = Introspector.getBeanInfo(user.getClass(), Object.class);
System.out.println("所有屬性描述:");
// 獲取所有的屬性描述
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor propertyDescriptor : pds) {
System.out.println(propertyDescriptor.getName());
}
System.out.println("所有方法描述:");
for (MethodDescriptor methodDescriptor : beanInfo.getMethodDescriptors()) {
System.out.println(methodDescriptor.getName());
// Method method = methodDescriptor.getMethod();
}
}
User.java
public class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
想了解更多精彩內(nèi)容請關(guān)注我的公眾號