采用反射处理多重if else

来源:互联网 发布:李小璐遭网络诈骗 编辑:程序博客网 时间:2024/06/11 04:35

最近在项目中添加一个批量导出Excel的功能,由于不同类型的企业服务类已经实现了单个导出Excel功能,如果把企业类型传进来,就能够得到每个企业的服务实现类名,只要调用下每个企业服务实现类的导出Excel功能就可以,刚开始想到如果一个类型一个类型的去判断,那不得累死,而且流式代码一大串,很不优雅,不是有类名了吗?这是想到了反射,通过类名加载类,然后调用下就可以了。

服务类接口定义片段:

/**  * M model DTO  * E entity 实体类  */public interface IBaseService<M extends Serializable, E extends Serializable> {/** * 导出Excel功能 * @param model * @return * @throws SystemException */public List<ExcelSheet> exportData(M model) throws SystemException;}

每个服务实现类均实现类IBaseService接口中的exportData方法,所有获取的bean可以统一转换成IBaseService,代码片段:

// 1.通过反射获取DTOString dtoClassName = "io.steveguoshao.rms.dto." + qylx + "DTO";Class<?> dtoClazz = Class.forName(dtoClassName);Method setQybhMethod = dtoClazz.getMethod("setQybh", String.class);Object dto = dtoClazz.newInstance();// 2.把企业编号值放入获取的DTO中setQybhMethod.invoke(dto, qybh);String serviceName = qylx.toLowerCase() + "Service";// 3.通过Spring获取服务类IBaseService<Serializable, ?> service = SpringContextUtils.getBean(serviceName);// 4.调用接口中的exportData方法List<ExcelSheet> list = service.exportData((Serializable) dto);

假如IBaseService接口中没有定义exportData方法,但是每个服务类中均有exportData方法,可以把上面的代码改成下面这样:

// 1.通过反射获取DTOString dtoClassName = "io.steveguoshao.rms.dto." + qylx + "DTO";Class<?> dtoClazz = Class.forName(dtoClassName);Method setQybhMethod = dtoClazz.getMethod("setQybh", String.class);Object dto = dtoClazz.newInstance();// 2.把企业编号值放入获取的DTO中setQybhMethod.invoke(dto, qybh);String serviceName = qylx.toLowerCase() + "Service";String methodName = "exportData方法";// 3.通过Spring获取服务类Object bean = SpringContextUtils.getBean(serviceName);// 4.获取exportData方法Method method = bean.getClass().getMethod(methodName, Serializable.class);// 5.通过反射调用类中的exportData方法dataList = (List<ExcelSheet>) method.invoke(bean, (Serializable) dto);


0 0
原创粉丝点击