内省是 java 语言对 bean 类属性、事件的一种处理方法(也就是说给定一个javabean对象,我们就可以得到/调用它的所有的get/set方法)。
例如类 a 中有属性 name, 那我们可以通过 getname,setname 来得到其值或者设置新的值。通过 getname/setname 来访问 name 属性,这就是默认的规则。
java 中提供了一套 api 用来访问某个属性的 getter/setter 方法,通过这些 api 可以使你不需要了解这个规则,这些 api 存放于包 java.beans 中。
一般的做法是通过类 introspector 的 getbeaninfo方法 来获取某个对象的 beaninfo 信息,然后通过 beaninfo 来获取属性的描述器(propertydescriptor),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后我们就可以通过反射机制来调用这些方法。
内省测试类:introspector.java
java代码
package com.royzhou.bean;
import java.beans.beaninfo; import java.beans.introspector; import java.beans.methoddescriptor; import java.beans.propertydescriptor;
public class introspectortest {
public static void main(string[] args) throws exception {
simplebean sb = new simplebean("royzhou",new string[]{"football","backetball"});
system.out.println(sb);
/**
* 使用introspector.getbeaninfo(simplebean.class)将bean的属性放入到beaninfo中。
* 第二个参数为截止参数,表示截止到此类之前,不包括此类。
* 如果不设置的话,那么将会得到本类以及其所有父类的info。
* beaninfo中包含了simplebean的信息
*/
beaninfo beaninfo = introspector.getbeaninfo(sb.getclass());
//将每个属性的信息封装到一个propertydescriptor形成一个数组其中包括属性名字,读写方法,属性的类型等等propertydescriptor[] propertys = beaninfo.getpropertydescriptors();
for(propertydescriptor property : propertys) {
system.out.println("属性名:" + property.getname()); system.out.println("类型:" + property.getpropertytype());
}
system.out.println();
system.out.println("列出simplebean的所有方法"); methoddescriptor[] methods = beaninfo.getmethoddescriptors();
for(methoddescriptor method : methods) {
system.out.println(method.getname());
}
system.out.println();
/**
*重新设置属性值
*/
for(propertydescriptor property : propertys) {
if(property.getpropertytype().isarray()){//getpropertytype得到属性类型。
if(property.getpropertytype().isarray()) { if("hobby".equals(property.getname())) {
//getcomponenttype()可以得到数组类型的元素类型
if(property.getpropertytype().getcomponenttype().equals(string.class)) {
//getwritemethod()得到此属性的set方法----method对象,然后用invoke调用这个方法
property.getwritemethod().invoke(sb, new object[]{new string[]{"tennis","fishing"}});
}
}
}
} else if("name".equals(property.getname())) { property.getwritemethod().invoke(sb, new object[] { "royzhou1985" });
}
}
======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/