Apache Commons 的 beanutils copy,一直有个说法,性能差。
这不是今天的重点。
重点是,经常出现问题。
所以有了,
JavaKit
// Apache Commons BeanUtils.copyProperties,默认有“bug”,坑人 static { // 源对象,如果为null,会给个默认值,Integer从null变为0.(坑爹啊) // null值不转换 ConvertUtils.register( new DateConverter( null ), java.util.Date. class ); ConvertUtils.register( new LongConverter( null ), Long. class ); ConvertUtils.register( new ShortConverter( null ), Short. class ); ConvertUtils.register( new IntegerConverter( null ), Integer. class ); ConvertUtils.register( new DoubleConverter( null ), Double. class ); ConvertUtils.register( new BigDecimalConverter( null ), BigDecimal. class ); } public static void copyProperties(Object dest, Object orig) { try { org.apache.commons.beanutils.BeanUtils.copyProperties(dest, orig); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } |
如果通过JavaKit调用,肯定会先初始化。(引入JavaKit类的时候,会先执行static方法)。
但是,今天遇到了问题:
另外一个类,直接使用
org.apache.commons.beanutils.BeanUtils.copyProperties(dest, orig);
这个时候提示,org.apache.commons.beanutils.ConversionException: No value specified for 'Date'
为啥呢?
因为,这个方法调用的时候,JavaKit还没有引入过。
所以static方法没有初始化。
好的做法是,统一用JavaKit一个地方的copy方法。还有 populate之类的也一样。
public static void populate(Object dest, Map<String, Object> map) { try { BeanUtils.populate(dest, map); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } |
首先验证:JavaKit.populate(oaOrgMember, map);
这样调用肯定没问题。
然后,上面的分析真的正确吗?
做了测试:
原来写法:BeanUtils.populate(oaOrgMember, map); 报错
新写法:
JavaKit.existNotEmpty("a");
BeanUtils.populate(oaOrgMember, map); 不报错
而且发现,执行一个很简单的方法existNotEmpty,竟然有了短暂的停顿。
应该是在执行 static初始化块导致的。
结论:一个类的static{},首次使用 类时,类才会引入,static块才初始化。