java 中的内省机制

来源:互联网 发布:信捷plc编程软件xc xd 编辑:程序博客网 时间:2024/05/17 09:38

内省是 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^)/