动态对象(DynamicObject)与普通Java对象转换工具原创
10人赞赏了该文章
2,238次浏览
编辑于2023年01月14日 19:01:04
摘要由AI智能服务提供
苍穹平台提供低代码开发能力,通过动态对象统一单据对象属性差异,但动态对象在跨模块协作中因可变性和属性不明确而不适用。为此,需封装动态对象与Java对象间的转换工具,通过定义配置注解与开发转换工具实现属性自动转换。示例展示了如何通过注解配置对象属性转换,并使用转换工具在动态对象与Java对象间互相转换,确保接口定义明确且灵活操作数据。
有用
反馈
一、概述
苍穹平台提供了低代码开发的能力,通过动态对象统一了各单据、各对象在属性上的差异,实现了对象的统一管理。但是在部分场景(例如接口)中由于动态对象的可变性和属性信息不明确的特性,因此动态对象不太适合跨模块协作。为了明确接口定义的输入及输出,一般使用Java对象作为数据传输对象,但是在苍穹平台上又是以动态对象的方式进行数据操作,这就有必要封装一个动态对象跟普通Java对象之间的转换,实现两者之间属性的自动转换和映射。
二、设计思路
1、定义配置注解,用于动态对象与普通java对象的映射关系。
2、开发转换工具,实现动态对象转Java对象和Java对象转动态对象。
三、代码实现
1、定义配置注解,用于动态对象与普通java对象的映射关系。
/** * 对象属性转换配置注解,用于动态对象与常规Java对象的转换配置 */ @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface ConvertConfig { /** * 动态对象标识 * * @return */ String name(); } /** * 对象属性转换配置注解,用于动态对象与常规Java对象的转换配置,将动态对象属性名与java对象属性名进行映射。 */ @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface ConvertPropertyConfig { /** * 动态对象标识 * * @return */ String fieldId(); }
2、开发转换工具,实现动态对象转Java对象和Java对象转动态对象。
/** * 对象属性转换工具 */ public class ConvertObjectHelper { /** * 动态对象转java对象 * * @param dynamicObject 动态对象 * @param tClass java类对象 * @param <T> * @return * @throws IllegalAccessException * @throws InstantiationException */ public static <T> T convertFromDynamicObject(DynamicObject dynamicObject, Class<T> tClass) throws IllegalAccessException, InstantiationException { //获取声明的属性 Field[] fields = tClass.getDeclaredFields(); //创建返回对象 T instance = tClass.newInstance(); //赋值处理 for (Field field : fields) { ConvertPropertyConfig property = field.getAnnotation(ConvertPropertyConfig.class); if (property != null) { String fieldId = property.fieldId(); //写入 field.setAccessible(true); field.set(instance, dynamicObject.get(fieldId)); } } return instance; } /** * java对象转动态对象 * * @param data java对象 * @param <T> * @return * @throws IllegalAccessException * @throws InstantiationException */ public static <T> DynamicObject convertToDynamicObject(T data) throws IllegalAccessException, InstantiationException { //数据为空 if (data == null || data.getClass().getAnnotation(ConvertConfig.class) == null) { return null; } //获取注解配置信息 ConvertConfig config = data.getClass().getAnnotation(ConvertConfig.class); //调用重载的方法转换为动态对象 return convertToDynamicObject(config.name(), data); } /** * java对象转动态对象 * * @param dyName 动态对象标识名 * @param data java对象 * @param <T> * @return * @throws IllegalAccessException * @throws InstantiationException */ public static <T> DynamicObject convertToDynamicObject(String dyName, T data) throws IllegalAccessException, InstantiationException { //创建动态对象 DynamicObject dynamicObject = new DynamicObject(EntityMetadataCache.getDataEntityType(dyName)); //获取声明的属性 Field[] fields = data.getClass().getDeclaredFields(); //赋值处理 for (Field field : fields) { ConvertPropertyConfig property = field.getAnnotation(ConvertPropertyConfig.class); if (property != null) { //写入 field.setAccessible(true); dynamicObject.set(property.fieldId(), field.get(data)); } } return dynamicObject; } }
四、运用示例
java对象
@ConvertConfig(name = "kd65_student") public class Student { @ConvertPropertyConfig(fieldId = "id") private Long id; @ConvertPropertyConfig(fieldId = "kd_name") private String name; @ConvertPropertyConfig(fieldId = "kd_age") private Integer age; public Student() { } @Override public String toString() { return "Student{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + '}'; } }
运用示例代码
String dyName = "kd65_student"; DynamicObject dy = new DynamicObject(EntityMetadataCache.getDataEntityType(dyName)); dy.set("id", 100000L); dy.set("kd_name", "张三"); dy.set("kd_age", 18); Student s1 = ConvertObjectHelper.convertFromDynamicObject(dy,Student.class); System.out.println("s1:"+s1); System.out.println("将s1转换为动态对象object1"); DynamicObject object1 = ConvertObjectHelper.convertToDynamicObject(s1); System.out.println("再将动态对象object1转换为s2"); Student s2 = ConvertObjectHelper.convertFromDynamicObject(object1,Student.class); System.out.println("s2:"+s2); System.out.println("将s2转换为动态对象object2"); DynamicObject object2 = ConvertObjectHelper.convertToDynamicObject(dyName,s2); System.out.println("再将动态对象object2转换为s3"); Student s3 = ConvertObjectHelper.convertFromDynamicObject(object2,Student.class); System.out.println("s3:"+s3);
输出:
动态对象元数据定义
赞 10
10人点赞
还没有人点赞,快来当第一个点赞的人吧!
打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!
推荐阅读