有的时候后端需要对传进来的参数进行统一处理,而各种参数可能类型都不相同,它们可能有的包含了需要处理的字段,有的没有,一种常用的方法就是逐个处理,这样有太多的冗余代码,而且不好维护.可以利用反射和多态的特性对参数进行处理.
比如,在我们的系统中,前端传过来一个参数带有语言language 字段,我们需要把us转换成en zh转换为zh-tw 等等,我们就可以写一个统一的方法
package cn.himobi.facesecretservice.common.util;
import cn.himobi.facesecretservice.common.enums.LanguageEnum;
import lombok.extern.slf4j.Slf4j;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* @description:
* @author: yangzheng
* @time: 2019/8/15 20:02
*/
@Slf4j
public class LanguageUtil {
/**
* @description: 反射调用参数,改变语言
* @param:
* @return:
* @author: yangzheng
* @time: 2019/8/15 20:54
*/
public static <T> T languageTrans(T param) {
Class clazz = param.getClass();
try {
Field field = clazz.getDeclaredField("language");
String filedName = field.getName();
Method methodGet = clazz.getDeclaredMethod("get" + filedName.substring(0, 1).toUpperCase() + filedName.substring(1));
String language = (String)methodGet.invoke(param);
// 繁体中文与简体中文都返回繁体中文
if (LanguageEnum.ZH.getType().equals(language)||LanguageEnum.ZH_RHK.getType().equals(language)){
language = LanguageEnum.ZH_TW.getType();
}
// 繁体中文与简体中文都返回繁体中文
if (LanguageEnum.US.getType().equals(language)){
language = LanguageEnum.EN.getType();
}
// 印尼转换
if (LanguageEnum.IN.getType().equals(language)){
language =LanguageEnum.ID.getType() ;
}
PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);
Method setMethod = pd.getWriteMethod();
setMethod.invoke(param, language);
} catch (Exception e) {
log.error("转换异常");
}
return param;
}
}
package cn.himobi.facesecretservice.common.enums;
import lombok.Getter;
@Getter
public enum LanguageEnum {
US("us","美国",""),
EN("en","英文",""),
ZH("zh","简体中文","ft"),
ZH_TW("zh-TW","繁体中文","ft"),
ZH_RHK("zh-rHK","香港繁体中文","ft"),
FR("fr","法语","fy"),
HI("hi","印地语","yd"),
PT("pt","葡萄牙语","pty"),
ES("es","西班牙语","xby"),
DE("de","德语","dy"),
KO("ko","韩语","hy"),
NL("nl","荷兰","hl"),
RU("ru","俄语","ru"),
PL("pl","波兰语","pl"),
IT("it","意大利语","it"),
JA("ja","日语","ja"),
AR("ar","阿拉伯语","ar"),
MS("ms","马来语","ms"),
UK("uk","乌克兰语","uk"),
ID("id","印尼语","id"),
IN("in","印尼语-Android","in"),
;
private String type;
private String name;
private String sqlName;
LanguageEnum(String type, String name,String sqlName) {
this.type = type;
this.name = name;
this.sqlName = sqlName;
}
public static LanguageEnum getByType(String type) {
for (LanguageEnum languageEnum : values()) {
if (languageEnum.getType().equals(type)) {
return languageEnum;
}
}
return null;
}
public static boolean getByTypeBoolean(String type) {
for (LanguageEnum languageEnum : values()) {
if (languageEnum.getType().equals(type)) {
return true;
}
}
return false;
}
}
如果那里需要转换语言,直接调用这个方法即可
param = LanguageUtil.languageTrans(param);
当然还可以利用拦截器进行全局统一处理,实现起来也不难,这里就不多做描述了