内省:IntroSpector-->JavaBean-->特殊的java类
如果一个java类中的一些方法符合某种命名规则,可以把它当做JavaBean来使用。
如果把某个类视为javaBean,这个类的属性时根据它的get和set方法来确定的。比如setAge和getAge
那么这个javaBean就有一个age属性。
JavaBean中必须带有一个空参数的构造函数。
如果一个java类中的一些方法符合某种命名规则,可以把它当做JavaBean来使用。
如果把某个类视为javaBean,这个类的属性时根据它的get和set方法来确定的。比如setAge和getAge
那么这个javaBean就有一个age属性。
JavaBean中必须带有一个空参数的构造函数。
getProperties和setProperties方法:
private static Object getProperties(Object obj,String propertyName)throws Exception
{
PropertyDescriptor pd = new PropertyDescriptor(propertyName,obj.getClass());
Method methodGetX = pd.getReadMethod();//获得用于读取属性值的方法
Object retVal = methodGetX.invoke(obj);//调用获得的底层读取方法得到属性值
return retVal;
}
private static void setProperties(Object obj,String propertyName,Object value)throws Exception
{
PropertyDescriptor obj = new PropertyDescriptor(propertyName,obj.getClass());
Method methodSetX = obj.getWriteMethod();//获得用于写入属性值的方法
methodSetX.invoke(obj,value);//调用获得的底层写入方法设置新的属性
}
比较复杂的getProperties方法:
private static Object getProperties(Object obj,String PropertyName)throws Exception
{
BeanInfo beanInfo = IntroSpector.getBeanInfo(obj.getClass());
//在javabean上进行内省,了解该对象的所有属性,公开的方法和事件
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
//获得该对象所有属性
Object retVal = null;
for(PropertyDescriptor pd : pds)//对所有属性进行遍历
{
if(pd.getName().equals(propertyName))//找到与指定属性相同的属性
{
Method methodGetX = pd.getReadMethod();//生成对应的方法类
retVal = methodGetX.invoke(obj);//调用该底层方法
}
}
return retVal;
}
BeanUtils和commonslogging工具包:
BeanUtils.setProperty(bean,name,value);//value 必须是String类型,getProperty返回值也是String
BeanUtils.getProperty(bean,name);//value是String 类型。name可以设置成层级模式,比如:birthday.time,但上级的必须实例对象。
PropertyUtils.setProperty(bean,name,value);//value是Object类,返回值也是Object