最近遇到这样的情况:系统B依赖于系统A,系统C依赖于系统B,但是系统C有些方法直接调用了系统A,所以这里系统C,跨级调用了。所以B系统给C和A做了中介,将C要调用的方法转发了一下。
例子:
--
如:A系统中的 ResultDTO query(QueryParamDTO dto), B系统需要重新写一个方法,然后调用,并且将结果返回。以供C调用,这样就去掉了C对A的依赖。
那么问题来了。ResultDTO和QueryParamDTO这两个类型也是A系统中的。所以B系统还得重新封装一个B自己的DTO(BResultDTO和BQueryParamDTO)返回给C,于是就有了BQueryDTO转换为QueryDTO的过程。
两个类生成的对象不能互相强制转换,所以只能一个个属性值设置。由于属性名称又相同,所以就利用java反射来做。代码如下: 其中遇到了枚举类型(enum)的转换的问题,不能直接set,需要转换成定义的enum类型才可以。
如:CardTypeEnum类型直接设置为NocardTypeEnum,尽管里面的枚举元素都是相同的都不行。具体转换看代码:
private void reflectSetValue(BasicParamDTO basicParamDTO){ Method[] methods = basicParamDTO.getClass().getMethods(); for (Method method : methods) { String fieldName = StringUtils.replaceOnce(method.getName(), "set", ""); fieldName = StringUtils.uncapitalize(fieldName); Field sourceField = ReflectionUtils.findField(this.verifyParamOutterDTO.getClass(), fieldName); if (CheckUtils.isNull(sourceField)) { continue; } // 取得属性 Field targetField = ReflectionUtils.findField(basicParamDTO.getClass(), fieldName); makeAccessible(targetField); makeAccessible(sourceField);// 赋值给这个field try { Object obj = sourceField.get(this.verifyParamOutterDTO); if (CheckUtils.isNull(obj)){ continue; } //设置枚举类型 ,将一个枚举类,转换成另一个枚举类 if (obj.getClass().isEnum()){ Method valueOfMethod = targetField.getType().getMethod("valueOf", String.class); obj = ReflectionUtils.invokeJdbcMethod(valueOfMethod, null, new Object[]{obj.toString()}); } targetField.set(basicParamDTO, obj); } catch (Exception e) { LOGGER.info("反射赋值错误:{}", fieldName); } } } /** * 强制转换fileld可访问. */ protected static void makeAccessible(final Field field) { if (!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass().getModifiers())) { field.setAccessible(true); } }
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于