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()); }