javaBean与内省操作

    xiaoxiao2021-03-25  83

     最近在使用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); } }

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

    转载请注明原文地址: https://ju.6miu.com/read-50235.html

    最新回复(0)