Java 內省機制

來源:互聯網
上載者:User

標籤:

一、內省

  內省(Introspector) 是Java 語言對 JavaBean 類屬性、事件的一種預設處理方法。JavaBean是一種特殊的類,主要用於傳遞資料資訊,這種類中的方法主要用於訪問私人的欄位,且方法名符合某種命名規則。如果在兩個模組之間傳遞資訊,可以將資訊封裝進JavaBean中,這種對象稱為“值對象”(Value Object),或“VO”,方法比較少,這些資訊儲存在類的私人變數中,通過set()、get()獲得,如下所示:

 1 public class Student {     2     public Student(){ 3         System.out.println("調用構造Student方法"); 4     } 5     public Student(int age,String name){ 6         this.age=age; 7         this.name = name; 8     }     9     private int age;10     private String name;11     public int getAge() {12         return age;13     }14     public void setAge(int age) {15         this.age = age;16     }17     public String getName() {18         return name;19     }20     public void setName(String name) {21         this.name = name;22     }23 }
View Code

    在類Person中有屬性name, 那我們可以通過 getName,setName來得到其值或者設定新的值,通過getName/setName來訪問userName屬性,這就是預設的規則。Java JDK中提供了一套 API用來訪問某個屬性的 getter/setter 方法,這就是內省。

JDK內省類庫:PropertyDescriptor類:

  PropertyDescriptor類表示JavaBean類通過儲存空間匯出一個屬性。主要方法:
      1. getPropertyType(),獲得屬性的Class對象;
      2. getReadMethod(),獲得用於讀取屬性值的方法;getWriteMethod(),獲得用於寫入屬性值的方法;
      3. hashCode(),擷取對象的雜湊值;
      4. setReadMethod(Method readMethod),設定用於讀取屬性值的方法;
      5. setWriteMethod(Method writeMethod),設定用於寫入屬性值的方法。

具體執行個體如下所示:

 1  Student st = new Student(23,"崔穎"); 2  String propertyName = "age"; 3 //1.通過構造器來建立PropertyDescriptor對象 4  PropertyDescriptor pd = new PropertyDescriptor("name", Student.class); 5  PropertyDescriptor pd2 = new PropertyDescriptor("age",Student.class); 6  //2.通過該對象來獲得寫方法 7  Method method1= pd.getReadMethod(); 8  method2= pd2.getReadMethod(); 9 //3.執行寫方法10  Object object=method1.invoke(st);11  Object object2 = method2.invoke(st);12  //4.輸出對象欄位的值13  System.out.println(object);14  System.out.println(object2);15   /*//5.通過對象獲得讀方法16  method = pd.getReadMethod();17  //6.執行讀方法並定義變數接受其傳回值並強制塑形18  String name = (String) method.invoke(st, null);19  //7.輸出塑形後的值20  System.out.println(name);*/21     }
View Code

在上面樣本中,通過屬性描述類獲得讀取屬性以及寫入屬性的方法,進而可以對JavaBean的屬性進行讀取操作。 

  還有一種做法是通過類Introspector的getBeanInfo()方法擷取某個對象的BeanInfo資訊,然後通過BeanInfo來擷取屬性的描述器(PropertyDescriptor),通過這個屬性描述器就可以擷取某個屬性對應的 getter/setter方法,然後我們就可以通過反射機制來調用這些方法。我們又通常把javabean的執行個體對象稱之為值對象(Value Object),因為這些bean中通常只有一些資訊欄位和儲存方法,沒有功能性方法,JavaBean實際就是一種規範,當一個類滿足這個規範,這個類就能被其它特定的類調用。一個類被當作javaBean使用時,JavaBean的屬性是根據方法名推斷出來的,它根本看不到java類內部的成員變數,通過去掉set方法首碼,然後取剩餘部分,如果剩餘部分的第二個字母是小寫,則把剩餘部分的首字母改成小寫。

 1 public static void test2() throws Exception{ 2            Student student = new Student(); 3            //1.通過Introspector來擷取bean對象的beaninfo  4            BeanInfo bif = Introspector.getBeanInfo(Student.class); 5            //2.通過beaninfo來獲得屬性描述器(propertyDescriptor)  6            PropertyDescriptor pds[] = bif.getPropertyDescriptors(); 7            //3.通過屬性描述器來獲得對應的get/set方法 8            for(PropertyDescriptor pd:pds){ 9                   //4.獲得並輸出欄位的名字10                   System.out.println(pd.getName());11                   //5.獲得並輸出欄位的類型12                   System.out.println(pd.getPropertyType());13                   if(pd.getName().equals("name")){14                          //6.獲得PropertyDescriptor對象的寫方法15                          Method md = pd.getWriteMethod();16                          //7.執行寫方法17                          md.invoke(student, "sunfei");18                   }19            }20            //8.輸出所賦值欄位的值21            System.out.println(student.getName());22        }
View Code

 

Java 內省機制

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.