javaBean与内省操作

 最近在使用common-lang包下的bean处理类时,发现有些性能问题,于是研究了一下源码,在研究源码的过程中,

发现了以前没有涉足过的领域,java.beans.*包下的Introspector操作,做一下简单分析。

     (一)  javaBean方法命名规则

           1) 一个javaBean中的方法,去掉set/get前缀后,剩余的部分的第二个字母如果是小写,则所以其余字母都转为小写,

              譬如,setAge -> Age-> age,转换结束后就是javaBean的属性;

           2) 如果剩余部分的第二个字母大写,则全部转为大写,譬如 setAge->Age->AGE.

     

      (二) javaBean的内省操作

             1) BeanInfo接口,主要提供javaBean的属性、方法、事件等的信息维护,是内省操作的重要资源维护类;

             2) Introspetor类,提供了大量的静态方法,可以直接获取或者操作javaBean属性值;

            写一个简单的测试类,做一下基本的操作:

            /**
       * 内省操作的基本测试类
             * @author chenglei.zhang
            */
          public class IntrospectorTest {
         public static void main(String[] args) {
//创建cat实例(标准的JavaBean)
Cat cat = new Cat();
cat.setAddress("北京");
cat.setName("丽丽");
cat.setSex(1);
try {
//提取bean属性方法信息
BeanInfo beanInfo = Introspector.getBeanInfo(cat.getClass());
//获取属性描述器
PropertyDescriptor[] descripors = beanInfo.getPropertyDescriptors();
//自定义打印属性值的方法
printProperties(cat, descripors);

PropertyDescriptor pdName = null;
for (PropertyDescriptor pd : descripors) 
if ("name".equals(pd.getName())) {
pdName = pd;
break;
}
//内省方法直接修改属性值
setProperty(cat, pdName, "王芳");
//打印修改属性后的属性值
beanInfo = Introspector.getBeanInfo(cat.getClass());
descripors = beanInfo.getPropertyDescriptors();
printProperties(cat, descripors);
} catch (IntrospectionException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}

/**
* 自定义打印属性值
* @param cat - JavaBean实例
* @param pds - 属性描述器数组
* @throws IllegalAccessException
* @throws IllegalArgumentException
* @throws InvocationTargetException
*/
public static void printProperties(Cat cat, PropertyDescriptor[] pds) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
if (pds == null || pds.length == 0)
return;
for (PropertyDescriptor pd : pds) {
Method method = pd.getReadMethod();
System.out.println(pd.getName()+":"+method.invoke(cat));
}
}

/**
* 设置属性值
* @param cat - JavaBean实例
* @param pd - 属性描述器
* @param value - 属性值
* @throws IllegalAccessException
* @throws IllegalArgumentException
* @throws InvocationTargetException
*/
public static void setProperty(Cat cat, PropertyDescriptor pd, Object value) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Method method = pd.getWriteMethod();
method.invoke(cat, value);
}
}

  主要是对未知领域一些简单的总结认知,方便对源码的研究!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值