今天排查项目里一个奇奇怪怪的NPE问题,经过调试,最后竟是混用了不同包的BeanUtils所导致的,这里记录一下。
在 Java 中,有多个不同包下的 BeanUtils 类存在。这些类提供了类似的功能,但由于它们来自不同的库或框架,可能有一些差异。其中最明显的差异就是source bean和target bean的位置不同。
下面是一些常见的BeanUtils类:
-
org.apache.commons.beanutils.BeanUtils
:
这个 BeanUtils 类是 Apache Commons BeanUtils 库中提供的,用于实现 JavaBean 属性的拷贝和转换。它提供了诸如 copyProperties 方法等功能,用于将一个 JavaBean 的属性拷贝到另一个 JavaBean。 -
org.springframework.beans.BeanUtils
:
这个 BeanUtils 类是 Spring Framework 中提供的,用于处理 JavaBean 的操作。它提供了一些与 Apache Commons BeanUtils 类似的功能,如 copyProperties 方法,同时还支持更多 Spring 特定的功能,如类型转换、属性填充等。 -
net.sf.cglib.beans.BeanCopier
:
这个 BeanCopier 类是 CGLIB 库中提供的,它提供了高性能的 JavaBean 属性拷贝功能。与前两者不同,CGLIB 的 BeanCopier 类使用动态代码生成技术,以达到更高的性能。
其中,org.springframework.beans.BeanUtils把bean从A拷贝到B,org.apache.commons.beanutils.BeanUtils把bean从B拷贝到A。
凡是用到了BeanUtils的地方(特别是copy代码的时候),务必看清导的是哪个包
ATFWUS 2023-08-04