正文
我们都知道BeanUtil.toBean()方法,可以将一个map(key为属性名,value为属性值)转为你想要的对象的类型.最近在看项目之前的代码的时候,发现之前的代码里有一个操作,将实体类转为vo对象时,调用了这个方法,但是实体类的属性是String类型的,vo对象的类型是List型的,转化之后,竟然成功的将string转为了按照“,“分割的Long的List集合.所以我就自己写了个demo,想看看源码是怎么做的,代码如下:
public class Person {
private String games;
private Long id;
}
public class PersonVo {
private List<Long> games;
private String id;
}
@Test
public void test16(){
Person person = new Person();
person.setGames("11,23,24,55,56,215");
PersonVo personVo = BeanUtil.toBean(person, PersonVo.class);
System.out.println(personVo);//PersonVo(games=[11, 23, 24, 55, 56, 215], id=null)
}
可以看到,string的字符串被自动的处理成了按照“,"分割的list集合,然后我决定去看看他的源码是怎么封住的这个转化.主要的核心源码如下:
// 获取目标字段真实类型并转换源值
final Type fieldType = TypeUtil.getActualType(this.targetType, tDesc.getFieldType());
sValue = this.copyOptions.convertField(fieldType, sValue);//经过这行代码之后,值就完成了类型转换
sValue = copyOptions.editFieldValue(sFieldName, sValue);
下面就是为了集合类型做的类型转换操作代码:
// 特殊类型转换,包括Collection、Map、强转、Array等
final T result = convertSpecial(type, rowType, value, defaultValue); ConverterRegistry.java
最后还是通过hutool的CollUtil.addAll()将string转成了list集合
protected Collection<?> convertInternal(Object value) {
final Collection<Object> collection = CollUtil.create(TypeUtil.getClass(this.collectionType));
return CollUtil.addAll(collection, value, this.elementType);
}; CollectionConverter.java
string都可以转为list集合的话,那和long互转岂不是更加方便吗? 这样可以解决一个一直以来存在的问题,JavaScript的long型的精度丢失问题,我们可以很方便的把id转为了string型,从而避免了精读丢失,所带来的开发问题.
总结
这是我在掘金社区更新的第一篇文章,也是我所写的第一篇技术博客,技术研究的深度远远不够,学习路漫漫,还需不断努力,希望这篇文章可以帮助大家,最后,大家有什么更好的见解,可以在评论区发表自己的看法.2023,加油.