JAVA中BeanInfo的用法


1.补充。BeanUtils的效率问题:

      

 BeanUtils.copyProperties(dest,orgi);实际上是调用的 PropertyUtils.copyProterties(dest,orgi)这个方法来实现的;这个方法的效率是非常低的。通过查看原代码:发现属性之间的COPY。主要用到了。java.beans包里面的相关类和方法。对于原对象(orgi).首先获得BeanInfo类型的对象。如Introspector.getBeanInfo(a.class)。 这个BeanInfo类型的实例。包含了所有的Class类对象的信息。如果有父类。将首先加载获得父类的信息。通过BeanInfo对象。可以获得PropertyDescriptor[] 的数组。通过这个数组。可以获得原对象(orgi)的所有属性以及属性的值。
        在BeanUtils.copyProperties();方法中。首先循环获得原对象的一个属性。和属性对应的值。然后根据这个属性。循环目的对象(dest)的属性。找出两个属性一致的那个属性。然后通过,PropertyDescriptor对象中,获得WriteMethod的一个Method 类型对象。最好通过反射。写入属性的值到目标对象对应的属性。假如:原来对象有10个属性。目标对象有10个属性。则在整个copy方法中。需要执行至少10×10比较。少于10×10次的赋值。效率将非常低下。

 

 

2.补充。关于BeanInfo类型对象。
        BeanInfo对象。有较多的方法。主要的有两个。getPropertyDescriptor().返回一个PropertyDescriptor类型的数组。该类型对象包括父类Object.对象的class属性。
        另外一个是。getMethodDescriptor().返回的是一个MethodDescriptor类型的数组。这个数组中,包括对应Bean中的所有方法的属性。甚至是Object。类型定义的。wait().notify()等方法。 关于BeanInfo用法的简单测试:
     

    BeanInfo bif = Introspector.getBeanInfo(TFeeItemR.class);
      PropertyDescriptor[] pd = bif.getPropertyDescriptors();
      for(int i=0;i<pd.length;i++){
          System.out.println("name:"+pd[i].getName());
          System.out.println("read method name:"+pd[i].
          getReadMethod ().getName());
          System.out.println("displayname:"+pd[i].getDisplayName());
        }
    MethodDescriptor[] md = bif.getMethodDescriptors();for(int m=0;m<md.length;m++){
        System.out.println("name:"+md[m].getName());
        System.out.println("method name:"+md[m].getMethod().getName());
        System.out.println("displayname:"+md[m].getDisplayName());
     }
   BeanDescriptor bd = bif.getBeanDescriptor();
   System.out.println("display name:" + bd.getDisplayName());
   System.out.println("name:" + bd.getName());
   EventSetDescriptor[] esd = bif.getEventSetDescriptors();
   for(int m=0;m<esd.length;m++){
       System.out.println("name:"+esd[m].getName());
       System.out.println("method name:"+esd[m].getGetListenerMethod().getName());
       System.out.println("method name:"+esd[m].getRemoveListenerMethod().getName());
       System.out.println("method name:"+esd[m].getAddListenerMethod().getName());
       System.out.println("displayname:"+esd[m].getDisplayName());
  }


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM