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屬性,這就是默認的規(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有兩種方法:

  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();
    // 反射機制調(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 方法,然后通過反射機制來調(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)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市宋彼,隨后出現(xiàn)的幾起案子弄砍,更是在濱河造成了極大的恐慌,老刑警劉巖输涕,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件音婶,死亡現(xiàn)場離奇詭異,居然都是意外死亡莱坎,警方通過查閱死者的電腦和手機衣式,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人碴卧,你說我怎么就攤上這事弱卡。” “怎么了住册?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵婶博,是天一觀的道長。 經(jīng)常有香客問我荧飞,道長凡蜻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任垢箕,我火速辦了婚禮划栓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘条获。我一直安慰自己忠荞,他們只是感情好,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布帅掘。 她就那樣靜靜地躺著委煤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪修档。 梳的紋絲不亂的頭發(fā)上碧绞,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機與錄音吱窝,去河邊找鬼讥邻。 笑死,一個胖子當著我的面吹牛院峡,可吹牛的內(nèi)容都是我干的兴使。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了泰偿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤励幼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后口柳,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苹粟,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年啄清,在試婚紗的時候發(fā)現(xiàn)自己被綠了六水。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俺孙。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖掷贾,靈堂內(nèi)的尸體忽然破棺而出睛榄,到底是詐尸還是另有隱情,我是刑警寧澤想帅,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布场靴,位于F島的核電站,受9級特大地震影響港准,放射性物質(zhì)發(fā)生泄漏旨剥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一浅缸、第九天 我趴在偏房一處隱蔽的房頂上張望轨帜。 院中可真熱鬧,春花似錦衩椒、人聲如沸蚌父。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苟弛。三九已至,卻和暖如春阁将,著一層夾襖步出監(jiān)牢的瞬間膏秫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工做盅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留缤削,地道東北人。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓言蛇,卻偏偏與公主長得像僻他,于是被迫代替她去往敵國和親宵距。 傳聞我的和親對象是個殘疾皇子腊尚,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

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

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