cglib是一款比較底層的操做java字節碼的框架。
下面經過拷貝bean對象來測試BeanCopier的特性:
java
- public class OrderEntity {
- private int id;
- private String name;
-
- }
- public class OrderDto {
- private int id;
- private String name;
-
- }
- public class PropWithDiffType {
- private Integer id;
- private String name;
-
- }
- public class LackOfSetter {
- private int id;
- private String name;
-
- public LackOfSetter() {
- }
-
- public LackOfSetter(int id, String name) {
- this.id = id;
- this.name = name;
- }
-
-
-
-
- }
1. 屬性名稱、類型都相同: 框架
- @Test
- public void normalCopyTest() {
- OrderEntity entity = new OrderEntity();
- entity.setId(1);
- entity.setName("orderName");
- final BeanCopier copier = BeanCopier.create(OrderEntity.class, OrderDto.class, false);
- OrderDto dto = new OrderDto();
- copier.copy(entity, dto, null);
- Assert.assertEquals(1, dto.getId());
- Assert.assertEquals("orderName", dto.getName());
- }
結論:拷貝OK。
2. 屬性名稱相同、類型不一樣:
測試
- @Test
- public void sameNameDifferentTypeCopyTest() {
- OrderEntity entity = new OrderEntity();
- entity.setId(1);
- entity.setName("orderName");
- final BeanCopier copier = BeanCopier.create(OrderEntity.class, PropWithDiffType.class, false);
- PropWithDiffType dto = new PropWithDiffType();
- copier.copy(entity, dto, null);
- Assert.assertEquals(null, dto.getId());
- Assert.assertEquals("orderName", dto.getName());
- }
結論:名稱相同而類型不一樣的屬性不會被拷貝。
注意:即便源類型是原始類型(int, short和char等),目標類型是其包裝類型(Integer, Short和Character等),或反之:都不會被拷貝。
3. 源類和目標類有相同的屬性(二者的getter都存在),但目標類的setter不存在 this
- @Test
- public void targetLackOfSetterCopyTest() {
- OrderEntity entity = new OrderEntity();
- entity.setId(1);
- entity.setName("orderName");
- final BeanCopier copier = BeanCopier.create(OrderEntity.class, LackOfSetter.class, false);
- LackOfSetter dto = new LackOfSetter();
- copier.copy(entity, dto, null);
- }
結論:建立BeanCopier的時候拋異常。
致使異常的緣由是BeanCopier類的第128~133行 spa
- for (int i = 0; i < setters.length; i++) {
- PropertyDescriptor setter = setters[i];
- PropertyDescriptor getter = (PropertyDescriptor)names.get(setter.getName());
- if (getter != null) {
- MethodInfo read = ReflectUtils.getMethodInfo(getter.getReadMethod());
- MethodInfo write = ReflectUtils.getMethodInfo(setter.getWriteMethod());
4. 源類或目標類的setter比getter少 orm
- @Test
- public void sourceLackOfSetterCopyTest() {
- LackOfSetter source = new LackOfSetter(1, "throne");
- final BeanCopier copier = BeanCopier.create(LackOfSetter.class, OrderDto.class, false);
- OrderDto dto = new OrderDto();
- copier.copy(source, dto, null);
- Assert.assertEquals(1, dto.getId());
- Assert.assertEquals("throne", dto.getName());
- }
結論:拷貝OK。此時的setter多餘,但不會報錯。
總結:
1. BeanCopier只拷貝名稱和類型都相同的屬性。
2. 當目標類的setter數目比getter少時,建立BeanCopier會失敗而致使拷貝不成功。對象