前言
业务项目开发过程中,存在大量对象转换的地方,比如VO、DTO、Domain领域对象、PO、Request、Response等对象转换。当前转换的方式一般包括:
-
手写各个对象getset转换
-
利用MapSturct 注解,在编译后生成getset代码,可通过反编译class文件看到生成后代码
-
利用BeanUtils.copyProperties等运行时反射getset值
-
BeanCopier等运行时操作字节码生成代码
第1个方式体力活比较耗时耗力。第2个是相对推荐的方式,性能好,但对象比较复杂时,需额外配置注解或仍需手工getset。第3,4等方式相对比较耗时,不太推荐大量使用。
基于现状,我研发了一个idea插件:ObjectConverter, 可以在研发阶段生成对象转换的getset代码,研发人员可根据生成后的代码微调后使用。
ObjectConverter
整体逻辑:
-
安装插件后,插件弹出框,用户输入Source Class和Target Class,如果是当前类文件右键生成的,默认会把当前类路径作为Target Class的值。弹出插件的方式:
-
文件右键Generte..或alt+ insert后,弹框中选择Object Converter,弹框中Source Class和Target Class分别填写转换的原始类和目标类。注意类需要包括包路径
-
idea工具栏的Tools下,选择Object Converter,弹框中Source Class和Target Class分别填写转换的原始类和目标类。注意类需要包括包路径。
-
-
弹框确认后,生成Source Class和Target Class类的所有字段(包括嵌套对象)信息,Target Class的每个字段(包括字段类型是嵌套的其他类型)和Souce Class的所有字段做字段的相识度比较,获取相识度最大的字段作为该Target Class的字段set值。
-
字段相识度如果低于70%,生成的set代码上面会增加注释:FIXME:Low matching rate, match ratio。
-
-
生成的代码会生成一个java类文件,放到Target Class类的同级包路径下。文件命名:Target Class+Converter.java
-
如果存在同名的java类文件,会提醒已存在不会覆盖已有文件
-
当前插件为版本1,不支持的功能:
-
Collection下List、Set、Queue等类型的嵌套解析;
-
泛型类的处理;
-
转换对象不一致是字段级别的类型处理。
后面空了会升级代码后放到github,以及上传官方插件库。当前插件如附件,使用过程如有疑问或建议可讨论。
下面是插件使用过程的示例:
附录
插件提供对象转换能力,解决手工编写大量转换对象代码的耗时耗力问题,作为辅助工具,生成后的代码需根据情况做微调后使用。使用过程有疑问欢迎探讨。