java 中的內(nèi)省 introspector

概述

經(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有兩種方法:

  1. 通過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);
    }
}
  1. 通過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)注我的公眾號

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,740評論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,837評論 18 139
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,832評論 0 11
  • 該系列文章主要是記錄下自己暑假這段時間的學(xué)習(xí)筆記,暑期也在實(shí)習(xí),抽空學(xué)了很多,每個方面的知識我都會另起一篇博客去記...
    Yanci516閱讀 618評論 0 3
  • 歲月是把殺貓刀,刀刀見血。 黑夜,涼了我的寂寞。我在我的黑夜,淺坐。觸摸淡了的過往,為自己唱一首清涼的歌。 “...
    貓咪的雜貨鋪閱讀 250評論 0 2