內省是 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