创建方法

时间:2017-06-17 05:26:20

标签: java methods parameters

我正在开发REST API服务,每次发生异常时,我都需要在日志中显示发生此异常的参数,方法和类名。所以我有方法

的单例类
public void log(final String className,String methodName,final Map<String,String> params,final String cause) {
    final StringBuilder result=new StringBuilder();
    for (Map.Entry<String, String> entry : params.entrySet()) {
        result.append(entry.getKey()+" "+entry.getValue()+" ");
    }
    log.info("\n\t\t\tClass: "+className+"\n\t\t\t Method: "+methodName+"\n\t\t\t Params: "+result.toString()+" \n\t\t\t "+"Reason: "+cause);
}

使用示例

public String checkSession(String sid) {
    final Map<String, String> params = new HashMap<String, String>();
    params.put("sid", sid);
    if (sid.isEmpty()) {
        logger.log(this.getClass().getSimpleName(), "checkSession", params, " not valid session");
        return Enums.Error.WRONG_SESSION.toString();
    }
}

然而,在每种方法中,我都需要使用所有参数初始化此映射。如何编写将为所有方法返回Map的方法?

例如我有两种方法

public String createPass(String name,String surname) {
    final Map<String, String> params = new HashMap<String, String>();
        params.put("name", name); 
        params.put("surname", surname); 
    }

public String checkSession(String sid) {
    final Map<String, String> params = new HashMap<String, String>();
    params.put("sid", sid);
}

我需要的方法就像

public HashMap<String,String> method(String args...){
    final Map<String, String> params = new HashMap<String, String>
    for(...)
    map.put("parameter","parameterName");
}

1 个答案:

答案 0 :(得分:0)

我认为你能做的最好的事情是这样的:

public Map<String,String> paramsToMap(String... params){
    final Map<String, String> map = new HashMap<>();
    for(int i=0; i<params.length-1; i=i+2) {
        map.put(params[i], params[i+1]);
    }
    return map;
}

你这么称呼它:

public String createPass(String name, String surname) {
    final Map<String, String> params = paramsToMap("name", name, "surname", surname);
}

public String checkSession(String sid) {
    final Map<String, String> params = paramsToMap("sid", sid);
}

我希望我们可以使用反射,但是在编译时会删除参数名称,并且您将留下arg0arg1等...所以无法实现您想要的效果使用反射。您必须自己输入参数名称。

另外作为附注,我认为最好使用Map<String, Object>并让log方法排除如何将其打印到日志中。可能使用String.valueOf()