前言

大家在Coding的时候,经常会遇到这样一个情况,根据不同的条件去执行对应的代码。我们通常的处理方式是利用if-else判断,或者直接switch-case,特别是jdk1.6之后,swith开始支持判断String类型了。

但是如果有几十种情况上百种情况,用if-else来处理这段逻辑,代码看着特别不舒服。

解决这个麻烦有好几种办法,比如自定义注解、Spring结合策略模式、反射或者枚举。

下面分享一下使用Guava工具类通过反射动态调用方法。

业务描述

插座统计:数据库每添加一个插座实例,都统计一下这个插座属于中国哪个省份(细节不重要)

pom.xml

添加工具依赖

<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>20.0</version>
</dependency>

ProvinceEnum.java

前端传过来的是中文,需要获取对应的英文名,然后通过拼接的方式生成方法名。

 public enum ProvinceEnum {

     SHANDONG("山东", "Shandong"),

     SHANGHAI("上海", "Shanghai"),

     ZHEJIANG("浙江", "Zhejiang"),

     ANHUI("安徽", "Anhui"),

     FUJIAN("福建", "Fujian"),

     JIANGXI("江西", "Jiangxi"),

     GUANGDONG("广东", "Guangdong"),

     GUANGXI("广西", "Guangxi"),

     HAINAN("海南", "Hainan"),

     HENAN("河南", "Henan"),

     HUNAN("湖南", "Hunan"),

     HUBEI("湖北", "Hubei"),

     BEIJING("北京", "Beijing"),

     TIANJIN("天津", "Tianjin"),

     HEBEI("河北", "Hebei"),

     SHANXI("山西", "Shanxi"),

     INNERMONGOLIA("内蒙古", "Innermongolia"),

     NINGXIA("宁夏", "Ningxia"),

     QINGHAI("青海", "Qinghai"),

     SHAANXI("陕西", "Shaanxi"),

     GANSU("甘肃", "Gansu"),

     SINKIANG("新疆", "Sinkiang"),

     SICHUAN("四川", "Sichuan"),

     GUIZHOU("贵州", "Guizhou"),

     YUNNAN("云南", "Yunnan"),

     CHONGQING("重庆", "Chongqing"),

     TIBET("西藏", "Tibet"),

     LIAONING("辽宁", "Liaoning"),

     JILIN("吉林", "Jilin"),

     HEILONGJIANG("黑龙江", "Heilongjiang"),

     HONGKONG("香港", "Hongkong"),

     MACAO("澳门", "Macao"),

     TAIWAN("台湾", "Taiwan"),

     JIANGSU("江苏", "Jiangsu");

     private String code;

     private String msg;

     private ProvinceEnum(String code, String msg) {
this.code = code;
this.msg = msg;
} public String getCode() {
return code;
} public String getMsg() {
return msg;
} public static String getMsgByCode(String code) {
String msg = null;
for (ProvinceEnum e : ProvinceEnum.values()) {
if (e.getCode().equals(code)) {
msg = e.getMsg();
break;
}
}
return msg;
} }

点击展开

SocketStatistics.java

实体类,统计的对象

 public class SocketStatistics {
/**
* 主键自增长
*/
private Long pid; private Integer shandong; private Integer jiangsu; private Integer shanghai; private Integer zhejiang; private Integer anhui; private Integer fujian; private Integer jiangxi; private Integer guangdong; private Integer guangxi; private Integer hainan; private Integer henan; private Integer hunan; private Integer hubei; private Integer beijing; private Integer tianjin; private Integer hebei; private Integer shanxi; /**
* 内蒙古
*/
private Integer innermongolia; private Integer ningxia; private Integer qinghai; /**
* 陕西
*/
private Integer shaanxi; private Integer gansu; private Integer sinkiang; private Integer sichuan; private Integer guizhou; private Integer yunnan; private Integer chongqing; /**
* 西藏
*/
private Integer tibet; private Integer liaoning; private Integer jilin; private Integer heilongjiang; private Integer hongkong; /**
* 澳门
*/
private Integer macao; private Integer taiwan; /**
* 在线数量
*/
private Integer online; /**
* 离线数量
*/
private Integer outline; public Long getPid() {
return pid;
} public void setPid(Long pid) {
this.pid = pid;
} public Integer getShandong() {
return shandong;
} public void setShandong(Integer shandong) {
this.shandong = shandong;
} public Integer getJiangsu() {
return jiangsu;
} public void setJiangsu(Integer jiangsu) {
this.jiangsu = jiangsu;
} public Integer getShanghai() {
return shanghai;
} public void setShanghai(Integer shanghai) {
this.shanghai = shanghai;
} public Integer getZhejiang() {
return zhejiang;
} public void setZhejiang(Integer zhejiang) {
this.zhejiang = zhejiang;
} public Integer getAnhui() {
return anhui;
} public void setAnhui(Integer anhui) {
this.anhui = anhui;
} public Integer getFujian() {
return fujian;
} public void setFujian(Integer fujian) {
this.fujian = fujian;
} public Integer getJiangxi() {
return jiangxi;
} public void setJiangxi(Integer jiangxi) {
this.jiangxi = jiangxi;
} public Integer getGuangdong() {
return guangdong;
} public void setGuangdong(Integer guangdong) {
this.guangdong = guangdong;
} public Integer getGuangxi() {
return guangxi;
} public void setGuangxi(Integer guangxi) {
this.guangxi = guangxi;
} public Integer getHainan() {
return hainan;
} public void setHainan(Integer hainan) {
this.hainan = hainan;
} public Integer getHenan() {
return henan;
} public void setHenan(Integer henan) {
this.henan = henan;
} public Integer getHunan() {
return hunan;
} public void setHunan(Integer hunan) {
this.hunan = hunan;
} public Integer getHubei() {
return hubei;
} public void setHubei(Integer hubei) {
this.hubei = hubei;
} public Integer getBeijing() {
return beijing;
} public void setBeijing(Integer beijing) {
this.beijing = beijing;
} public Integer getTianjin() {
return tianjin;
} public void setTianjin(Integer tianjin) {
this.tianjin = tianjin;
} public Integer getHebei() {
return hebei;
} public void setHebei(Integer hebei) {
this.hebei = hebei;
} public Integer getShanxi() {
return shanxi;
} public void setShanxi(Integer shanxi) {
this.shanxi = shanxi;
} public Integer getInnermongolia() {
return innermongolia;
} public void setInnermongolia(Integer innermongolia) {
this.innermongolia = innermongolia;
} public Integer getNingxia() {
return ningxia;
} public void setNingxia(Integer ningxia) {
this.ningxia = ningxia;
} public Integer getQinghai() {
return qinghai;
} public void setQinghai(Integer qinghai) {
this.qinghai = qinghai;
} public Integer getShaanxi() {
return shaanxi;
} public void setShaanxi(Integer shaanxi) {
this.shaanxi = shaanxi;
} public Integer getGansu() {
return gansu;
} public void setGansu(Integer gansu) {
this.gansu = gansu;
} public Integer getSinkiang() {
return sinkiang;
} public void setSinkiang(Integer sinkiang) {
this.sinkiang = sinkiang;
} public Integer getSichuan() {
return sichuan;
} public void setSichuan(Integer sichuan) {
this.sichuan = sichuan;
} public Integer getGuizhou() {
return guizhou;
} public void setGuizhou(Integer guizhou) {
this.guizhou = guizhou;
} public Integer getYunnan() {
return yunnan;
} public void setYunnan(Integer yunnan) {
this.yunnan = yunnan;
} public Integer getChongqing() {
return chongqing;
} public void setChongqing(Integer chongqing) {
this.chongqing = chongqing;
} public Integer getTibet() {
return tibet;
} public void setTibet(Integer tibet) {
this.tibet = tibet;
} public Integer getLiaoning() {
return liaoning;
} public void setLiaoning(Integer liaoning) {
this.liaoning = liaoning;
} public Integer getJilin() {
return jilin;
} public void setJilin(Integer jilin) {
this.jilin = jilin;
} public Integer getHeilongjiang() {
return heilongjiang;
} public void setHeilongjiang(Integer heilongjiang) {
this.heilongjiang = heilongjiang;
} public Integer getHongkong() {
return hongkong;
} public void setHongkong(Integer hongkong) {
this.hongkong = hongkong;
} public Integer getMacao() {
return macao;
} public void setMacao(Integer macao) {
this.macao = macao;
} public Integer getTaiwan() {
return taiwan;
} public void setTaiwan(Integer taiwan) {
this.taiwan = taiwan;
} public Integer getOnline() {
return online;
} public void setOnline(Integer online) {
this.online = online;
} public Integer getOutline() {
return outline;
} public void setOutline(Integer outline) {
this.outline = outline;
} public void addTibet() {
this.tibet = this.tibet + 1;
} /**
* 山东+1
*
*/
public void addShandong() {
this.shandong = this.shandong + 1;
} /**
* 江苏+1
*
*/
public void addJiangsu() {
this.jiangsu = this.jiangsu + 1;
} /**
* 上海+1
*
*/
public void addShanghai() {
this.shanghai = this.shanghai + 1;
} /**
* 浙江+1
*
*/
public void addZhejiang() {
this.zhejiang = this.zhejiang + 1;
} /**
* 安徽+1
*
*/
public void addAnhui() {
this.anhui = this.anhui + 1;
} /**
* 福建+1
*
*/
public void addFujian() {
this.fujian = this.fujian + 1;
} /**
* 江西+1
*
*/
public void addJiangxi() {
this.jiangxi = this.jiangxi + 1;
} /**
* 广东+1
*
*/
public void addGuangdong() {
this.guangdong = this.guangdong + 1;
} /**
* 广西+1
*
*/
public void addGuangxi() {
this.guangxi = this.guangxi + 1;
} /**
* 海南+1
*
*/
public void addHainan() {
this.hainan = this.hainan + 1;
} /**
* 河南+1
*
*/
public void addHenan() {
this.henan = this.henan + 1;
} /**
* 湖南+1
*
*/
public void addHunan() {
this.hunan = this.hunan + 1;
} /**
* 湖北+1
*
*/
public void addHubei() {
this.hubei = this.hubei + 1;
} /**
* 北京+1
*
*/
public void addBeijing() {
this.beijing = this.beijing + 1;
} /**
* 天津+1
*
*/
public void addTianjin() {
this.tianjin = this.tianjin + 1;
} /**
* 河北+1
*
*/
public void addHebei() {
this.hebei = this.hebei + 1;
} /**
* 山西+1
*
*/
public void addShanxi() {
this.shanxi = this.shanxi + 1;
} /**
* 陕西+1
*
*/
public void addShaanxi() {
this.shaanxi = this.shaanxi + 1;
} /**
* 内蒙古+1
*
*/
public void addInnermongolia() {
this.innermongolia = this.innermongolia + 1;
} /**
* 宁夏+1
*
*/
public void addNingxia() {
this.ningxia = this.ningxia + 1;
} /**
* 青海+1
*
*/
public void addQinghai() {
this.qinghai = this.qinghai + 1;
} /**
* 甘肃+1
*
*/
public void addGansu() {
this.gansu = this.gansu + 1;
} /**
* 新疆+1
*
*/
public void addSinkiang() {
this.sinkiang = this.sinkiang + 1;
} /**
* 四川+1
*
*/
public void addSichuan() {
this.sichuan = this.sichuan + 1;
} /**
* 贵州+1
*
*/
public void addGuizhou() {
this.guizhou = this.guizhou + 1;
} /**
* 云南+1
*
*/
public void addYunnan() {
this.yunnan = this.yunnan + 1;
} /**
* 重庆+1
*
*/
public void addChongqing() {
this.chongqing = this.chongqing + 1;
} /**
* 辽宁+1
*
*/
public void addLiaoning() {
this.liaoning = this.liaoning + 1;
} /**
* 吉林+1
*
*/
public void addJilin() {
this.jilin = this.jilin + 1;
} /**
* 黑龙江+1
*
*/
public void addHeilongjiang() {
this.heilongjiang = this.heilongjiang + 1;
} /**
* 香港+1
*
*/
public void addHongkong() {
this.hongkong = this.hongkong + 1;
} /**
* 澳门+1
*
*/
public void addMacao() {
this.macao = this.macao + 1;
} /**
* 台湾+1
*
*/
public void addTaiwan() {
this.taiwan = this.taiwan + 1;
}
}

点击展开

service层逻辑

// 从数据库中取出插座统计记录,该表中只有一条记录,如有变化直接更新就是
SocketStatistics socketStatistics = socketStatisticsMapper.selectOne(); // 根据前端传过来的插座所属省份中文名,到省份枚举类中得到对应的英文名
// 再通过拼接的方式得到对应的方法名
String methodName = "add"
+ ProvinceEnum.getMsgByCode(socket.getProvince()); // 到SocketStatistics类中找到这个方法
Method method = SocketStatistics.class.getDeclaredMethod(methodName); // Guava的工具类通过反射,动态调用该方法
Invokable<SocketStatistics, Object> invokable = (Invokable<SocketStatistics, Object>) Invokable
.from(method);
invokable.invoke(socketStatistics); // 数据处理完后,更新数据库
socketStatisticsMapper.updateByPrimaryKeySelective(socketStatistics);

Guava动态调用方法的更多相关文章

  1. Struts2 动态调用方法

    struts2动态调用方法有两种方式 方式一:用通配符进行调用: Action方法: package com.bjyinfu.struts.actions; public class CatchDyn ...

  2. struts2 type="redirectAction"重定向 与动态调用方法

    <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-/ ...

  3. Xcode中Objc动态调用方法同时避免警告的几个办法

    我们在Xcode中使用objc写代码的时候往往会碰到动态调用方法的时候. 如果是静态调用这很常见,不会有任何问题: [self performSelector:@selector(method)]; ...

  4. C#使用表达式树动态调用方法并实现99乘法表

    我们在使用C#编程的时候,经常使用反射来动态调用方法,但有时候需要动态的生成方法,下面介绍使用表达式树的方式来自动生成方法,并调用. 首先需要说明什么是表达式,熟悉Linq的程序猿都用过类似于下面的代 ...

  5. C# 知识点笔记:IEnumerable<>的使用,利用反射动态调用方法

    IEnumerable<T>的使用 创建一个IEnumerable对象 List<string> fruits = new List<string> { " ...

  6. spring动态调用方法

    有的时候为了程序的灵活性,需要根据参数动态的调用方法.代码框架大致spring为主,下面是具体代码: 接口: 实现类(实现类中有一个从spring容器中取的对象) 这是最初我直接用反射去调用的代码: ...

  7. 利用java反射动态调用方法,生成grid数据

    项目中需要java后台查询并组装前台grid的数据,数据行数不定,数据行定义不定,开始用了最原始的方法,写了几百行,就是前台需要什么字段后台拼接什么字段,java代码冗余量非常大,并且不够灵活,一旦前 ...

  8. php中怎么使用call_user_func动态调用方法

    php中可使用call_user_func进行方法的动态调用,可以动态调用普通函数.类方法以及带参数的类方法1.定义一个普通函数getCurrentDate,用于获取今天日期.call_user_fu ...

  9. Action的动态调用方法

    Action执行的时候并不一定要执行execute方法,我们可以指定Action执行哪个方法: 1. 方法一(通过methed属性指定执行方法): 可以在配置文件中配置Action的时候用method ...

随机推荐

  1. [Java]使用Collections.Max,Min方法取集合类的最大最小值

    代码: package com.hy; import java.util.Arrays; import java.util.Collections; import java.util.List; pu ...

  2. idea git操作 -- 已有项目添加到git

    我们在使用git时,如果是先从git克隆项目,然后配置项目运行没问题,如果将已有项目添加到git,则项目环境还是提交不了git,还需要到克隆的仓库文件夹打开项目去操作git,如果有有类型情况可按照如下 ...

  3. input 表单

    1:datalist元素,一般与input组建配合使用,以定义可能输入的值,例如: <!DOCTYPE html> <html lang="en"> < ...

  4. JS原生代码之倒计时抢购

    学到了原声js改变input的disabled的属性值,因为想让倒计时结束的同时,抢购按钮可以被点击.代码为:document.getElementById("buy").disa ...

  5. jQuery.extend函数

    http://www.cnblogs.com/luckboy/archive/2009/06/25/1510870.html 1.扩展jQuery静态方法. 1$.extend({ 2test:fun ...

  6. 一百零六:CMS系统之修改邮箱功能完成

    这里采用把验证码放到memcached中,所以封装一个memcached的操作 import memcache cache = memcache.Client(['127.0.0.1:11211'], ...

  7. Ubuntu配置zsh

    安装zsh sudo apt-get install zsh chsh -s /bin/zsh 配置 curl -L https://raw.github.com/robbyrussell/oh-my ...

  8. java web 能够实现整个文件夹的上传下载吗?

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  9. JAVA 基础编程练习题1 【程序 1 不死神兔】

    1 [程序 1 不死神兔] 题目:古典问题:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月 又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 程序分析: 兔子 ...

  10. JRebel for IntelliJ

    好久没用jrebel了,跟前端进行项目联调总是有些许改动,还是热部署方便. 目前用的idea版本:IntelliJ IDEA 2019.2 JRebel插件版本:JRebel for IntelliJ ...