Introspector 内省是javase里很基础的知识点了,但在做项目的时候经常会使用到, struts2的action(还有struts1的formbean)也使用了内省机制提供的实现。前台的form标签具有一些属性(在配置文件中知道这个form提交到那个action,而这个action有和这个form相对应的属性及其 get/set),提交以后,由struts的servlet拦下来转发给某个具体的action.而在转发给action之前struts通过内省的方 式将form中的值set到了action中去。
一、Java内省机制
内省是 Java 语言对 Bean 类属性、事件的一种处理方法(也就是说给定一个javabean对象,我们就可以得到/调用它的所有的get/set方法)。
例如类 IntroBean 中有属性 name, value那我们可以通过 getName,setName 来得到其值或者设置新的值。通过 getName/setName 来访问 name 属性,这就是默认的规则。
Java 中提供了一套 API 用来访问某个属性的 getter/setter 方法,通过这些 API 可以使你不需要了解这个规则,这些 API 存放于包 java.beans 中。
一般的做法是通过类 Introspector 来获取某个对象的 BeanInfo 信息,然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor ),
通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后我们就可以通过反射机制来调用这些方法。
即使 类里没有 doub属性,只要类里有getDoub,setDoub属性,我们也可以通过BeanInfo来获取属性的描述器,再通过这个属性描述器就获取 getter/setter 方法 :看下下面代码来理解。
提供一个IntroBean 这样一个简单的bean类,其中没有doub属性,但提供了个getDoub ,setDoub方法
package com.jian;
public class IntroBean
{
String name;
Integer value;
public Double getDoub()
{
System.out.println("invoke getdoub!");
return null;
}
public void setDoub(Double doub)
{
System.out.println("invoke setdoub");
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public Integer getValue()
{
return value;
}
public void setValue(Integer value)
{
this.value = value;
}
public void Value(Integer value)
{
}
public void aaValue(Integer value)
{
}
}
从下面可以看出是根据bean 类里的set ,get 方法来构建PropertyDescriptor
package com.jian;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
public class IntrospectorTest
{
public static void main(String[] args) throws IntrospectionException
{
BeanInfo bi= Introspector.getBeanInfo(IntroBean.class,Object.class);
PropertyDescriptor[] pd= bi.getPropertyDescriptors();
String np;
for(int i=0;i<pd.length;i++){
np= pd[i].getReadMethod().getName();//ReadMethod就是读取,相当于getMethod();
System.out.println("read ="+np);
np=pd[i].getWriteMethod().getName();//WriteMethod就是设置,相当于setMethod();
System.out.println("write ="+np);
System.out.println("----------------");
}
}
}
运行结果:
read =getDoub
write =setDoub
----------------
read =getName
write =setName
----------------
read =getValue
write =setValue
----------------
即使 类里没有 doub属性,只要类里有getDoub,setDoub属性,我们也可以通过BeanInfo来获取属性的描述器(PropertyDescriptor),再通过这个属性描述器就获取 getter/setter 方法.