南昌市建设网站/南昌网站优化公司
问题由来:需要大量实现某个功能,需要根据不同链接调用不同方法,并返回类似信息,但是又不同
1.将不同链接抽出一个Enum对象
例:根据不同的链接,返回的内容相似,
根据穿入的是student还是class,返回对应的表的表头和显示的条数
public enum TableHeadEnum {//简单举例STUDENT("student","<tr><th>序号</th><th>姓名</th><th>性别</th><th>年龄</th></tr>",5),CLASS("class","<tr><th>序号</th><th>年级</th><th>班级</th><th>人数</th></tr>",3),;/*** 前台请求的url*/private String url;/*** 需要查询的表头*/private String tableHead;/*** 需要显示的数据*/private Integer size;public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getTableHead() {return tableHead;}public void setTableHead(String tableHead) {this.tableHead = tableHead;}public Integer getSize() {return size;}public void setSize(Integer size) {this.size = size;}TableHeadEnum(String url, String tableHead, Integer size) {this.url = url;this.tableHead = tableHead;this.size = size;}//根据不同的url返回不同的 TableHeadEnum 对象public static TableHeadEnum getTableHeadEnum(String url){for (TableHeadEnum tableHeadEnum : TableHeadEnum.values()) {String uurl=tableHeadEnum.url.toLowerCase();if (url.toLowerCase().equals(uurl)){return tableHeadEnum;}}return null;}}
2.将业务逻辑部分根据URL反射
将所有反射的方法名统一格式,方便拼接调用(也可以在定义enum 的时候加一个方法名的属性)
public String getSuggestions(MessageQuery messageQuery) throws Exception {TableHeadEnum tableHeadEnum = TableHeadEnum.getTableHeadEnum(messageQuery.getDataUrl());//得到的enum类为空,直接返回if (isEmpty(tableHeadEnum)){return "";}messageQuery.setSize(tableHeadEnum.getSize());//所有的方法是 get+dataUrl拼接起来的messageQuery.setMethodName("get"+messageQuery.getDataUrl());//从枚举类得到定义的表头String head=tableHeadEnum.getTableHead();//调用方法获取表格信息内容String body=getMes(messageQuery);//拼接表头(enum定义)和表格数据(反射获取)head+=body;return head;}/***MessageQuery 是我根据该条件查询值
**/@AutowiredMessageResult message; //将所有通过反射实现的方法放到某一个统一的类中public String getMes(MessageQuery messageQuery)throws Exception{Class clz = messageQuery.getClass();Method m = clz.getMethod(messageQuery.getMethodName(), messageQuery.getClass());//执行对应的方法,获取返回值(需要把我查询条件一起传过去)String string=(String) m.invoke(message,messageQuery);return string;}
3.将反射的类定义,并写里面的方法逻辑
@Component//因为要用到dao层或者service层,需要将反射的类注入到spring容器
public class SuggestionsResult {@AutowiredDataDao runDataDao;/*** 获取student信息*/public String getstudent(MessageQuery){//实现逻辑,返回拼好的表格bodyreturn ""; }/*** 获取班级信息*/public String getclass(MessageQuery){//实现逻辑,返回拼好的表格body return ""; }
}
注:可能会出现在反射的类中无法使用 @Autowire 注入dao层,原因可能是未将自定义实现逻辑的类注入到spring中
注注:小白代码,如有疑问,欢迎大佬指正