概述
經(jīng)常需要使用java對象的屬性來封裝程序的數(shù)據(jù),每次都使用反射技術(shù)完成此類操作過于麻煩,所以sun公司開發(fā)了一套API,專門用于操作java對象的屬性。
內(nèi)省(IntroSpector)是Java語言對JavaBean 類屬性、事件的一種處理方法。 例如類A中有屬性name,那我們可以通過getName,setName 來得到其值或者設(shè)置新的值。 通過getName/setName 來訪問name屬性,這就是默認(rèn)的規(guī)則。
Java中提供了一套API 用來訪問某個屬性的getter/setter方法,通過這些API可以使你不需要了解這個規(guī)則,這些API存放于包java.beans 中。
一般的做法是通過類Introspector的getBeanInfo方法獲取某個對象的BeanInfo信息,然后通過BeanInfo來獲取屬性的描述器(PropertyDescriptor),通過這個屬性描述器就可以獲取某個屬性對應(yīng)的getter/setter方法,然后我們就可以通過反射機(jī)制來調(diào)用這些方法。
我們又通常把javabean的實(shí)例對象稱之為值對象,因?yàn)檫@些bean中通常只有一些信息字段和存儲方法,沒有功能性方法。
一個JavaBean類可以不當(dāng)JavaBean用,而當(dāng)成普通類用。JavaBean實(shí)際就是一種規(guī)范,當(dāng)一個類滿足這個規(guī)范,這個類就能被其它特定的類調(diào)用。一個類被當(dāng)作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();
// 反射機(jī)制調(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 方法,然后通過反射機(jī)制來調(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)注我的公眾號