熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

java內省機制

2022-06-13   來源: Java核心技術 

  內省是 Java 語言對 Bean 類屬性事件的一種處理方法(也就是說給定一個javabean對象我們就可以得到/調用它的所有的get/set方法)

  例如類 A 中有屬性 name 那我們可以通過 getNamesetName 來得到其值或者設置新的值通過 getName/setName 來訪問 name 屬性這就是默認的規則

  Java 中提供了一套 API 用來訪問某個屬性的 getter/setter 方法通過這些 API 可以使你不需要了解這個規則這些 API 存放於包 javabeans 中

  一般的做法是通過類 Introspector 的 getBeanInfo方法 來獲取某個對象的 BeanInfo 信息然後通過 BeanInfo 來獲取屬性的描述器(PropertyDescriptor)通過這個屬性描述器就可以獲取某個屬性對應的 getter/setter 方法然後我們就可以通過反射機制來調用這些方法

  內省測試類:Introspectorjava

  Java代碼

  package comroyzhoubean;

  import javabeansBeanInfo; import javabeansIntrospector; import javabeansMethodDescriptor; import javabeansPropertyDescriptor;

  public class IntrospectorTest {

  public static void main(String[] args) throws Exception {

  SimpleBean sb = new SimpleBean(royzhounew String[]{footballbacketball});

  Systemoutprintln(sb);

  /**

  * 使用IntrospectorgetBeanInfo(SimpleBeanclass)將Bean的屬性放入到BeanInfo中

  * 第二個參數為截止參數表示截止到此類之前不包括此類

  * 如果不設置的話那麼將會得到本類以及其所有父類的info

  * BeanInfo中包含了SimpleBean的信息

  */

  BeanInfo beanInfo = IntrospectorgetBeanInfo(sbgetClass());

  //將每個屬性的信息封裝到一個PropertyDescriptor形成一個數組其中包括屬性名字讀寫方法屬性的類型等等PropertyDescriptor[] propertys = beanInfogetPropertyDescriptors();

  for(PropertyDescriptor property : propertys) {

  Systemoutprintln(屬性名: + propertygetName()); Systemoutprintln(類型: + propertygetPropertyType());

  }

  Systemoutprintln();

  Systemoutprintln(列出SimpleBean的所有方法); MethodDescriptor[] methods = beanInfogetMethodDescriptors();

  for(MethodDescriptor method : methods) {

  Systemoutprintln(methodgetName());

  }

  Systemoutprintln();

  /**

  *重新設置屬性值

  */

  for(PropertyDescriptor property : propertys) {

  if(propertygetPropertyType()isArray()){  //getPropertyType得到屬性類型

  if(propertygetPropertyType()isArray()) { if(hobbyequals(propertygetName())) {

  //getComponentType()可以得到數組類型的元素類型

  if(propertygetPropertyType()getComponentType()equals(Stringclass)) {

  //getWriteMethod()得到此屬性的set方法Method對象然後用invoke調用這個方法

  propertygetWriteMethod()invoke(sb new Object[]{new String[]{tennisfishing}});

  }

  }

  }

  } else if(nameequals(propertygetName())) { propertygetWriteMethod()invoke(sb new Object[] { royzhou });

  }

  }

  /**

  *獲取對象的屬性值

  */

  Systemoutprintln(獲取對象的屬性值);

  for(PropertyDescriptor property : propertys) {

  if(propertygetPropertyType()isArray()){  //getPropertyType得到屬性類型

  //getReadMethod()得到此屬性的get方法Method對象然後用invoke調用這個方法String[] result=(String[]) propertygetReadMethod()invoke(sb new Object[]{}); Systemoutprint(propertygetName()+:);//getName得到屬性名字for (int j = ; j < resultlength; j++) { Systemoutprint(result[j] + );

  }

  Systemoutprintln();

  }

  else{

  Systemoutprintln(propertygetName()+:+propertygetReadMethod()invoke(sb new Object[]{}));

  }

  }

  }

  }

  package comroyzhoubean;

  import javabeansBeanInfo; import javabeansIntrospector; import javabeansMethodDescriptor; import javabeansPropertyDescriptor;

  public class IntrospectorTest {

  public static void main(String[] args) throws Exception {

  SimpleBean sb = new SimpleBean(royzhounew String[]{footballbacketball});

  Systemoutprintln(sb);

  /**

  * 使用IntrospectorgetBeanInfo(SimpleBeanclass)將Bean的屬性放入到BeanInfo中

  * 第二個參數為截止參數表示截止到此類之前不包括此類

  * 如果不設置的話那麼將會得到本類以及其所有父類的info

  * BeanInfo中包含了SimpleBean的信息

  */

  BeanInfo beanInfo = IntrospectorgetBeanInfo(sbgetClass());

  //將每個屬性的信息封裝到一個PropertyDescriptor形成一個數組其中包括屬性名字讀寫方法屬性的類型等等PropertyDescriptor[] propertys = beanInfogetPropertyDescriptors();

  for(PropertyDescriptor property : propertys) {

  Systemoutprintln(屬性名: + propertygetName()); Systemoutprintln(類型: + propertygetPropertyType());

  }

  Systemoutprintln();

  Systemoutprintln(列出SimpleBean的所有方法); MethodDescriptor[] methods = beanInfogetMethodDescriptors();

  for(MethodDescriptor method : methods) {

  Systemoutprintln(methodgetName());

  }

  Systemoutprintln();

  /**

  *重新設置屬性值

  */

  for(PropertyDescriptor property : propertys) {

  if(propertygetPropertyType()isArray()){  //getPropertyType得到屬性類型

  if(propertygetPropertyType()isArray()) { if(hobbyequals(propertygetName())) {

  //getComponentType()可以得到數組類型的元素類型

  if(propertygetPropertyType()getComponentType()equals(Stringclass)) { //getWriteMethod()得到此屬性的set方法Method對象然後用invoke調用這個方法propertygetWriteMethod()invoke(sb new Object[]{new String[]{tennisfishing}});

  }

  }

  }

  } else if(nameequals(propertygetName())) { propertygetWriteMethod()invoke(sb new Object[] { royzhou });

  }

  }

  /**

  *獲取對象的屬性值

  */

  Systemoutprintln(獲取對象的屬性值);

  for(PropertyDescriptor property : propertys) {

  if(propertygetPropertyType()isArray()){  //getPropertyType得到屬性類型

  //getReadMethod()得到此屬性的get方法Method對象然後用invoke調用這個方法String[] result=(String[]) propertygetReadMethod()invoke(sb new Object[]{}); Systemoutprint(propertygetName()+:);//getName得到屬性名字for (int j = ; j < resultlength; j++) { Systemoutprint(result[j] + );

  }

  Systemoutprintln();

  }

  else{

  Systemoutprintln(propertygetName()+:+propertygetReadMethod()invoke(sb new Object[]{}));

  }

  }

  }

  }

  輸出結果:

  comroyzhoubeanSimpleBean@aef

  name:=royzhou

  hobby:footballbacketball

  屬性名:class

  類型:class javalangClass

  屬性名:hobby

  類型:class [LjavalangString;

  屬性名:name

  類型:class javalangString

  列出SimpleBean的所有方法

  hashCode

  setHobby

  equals

  wait

  wait

  notify

  getClass

  toString

  notifyAll

  getHobby

  setName

  wait

  getName

  獲取對象的屬性值

  class:class comroyzhoubeanSimpleBean hobby:tennisfishing

  name:royzhou


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26908.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.