【问题标题】:Create a Map of all the parameter names and values of a method创建方法的所有参数名称和值的 Map
【发布时间】:2017-06-17 05:26:19
【问题描述】:

我正在开发 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");
}

【问题讨论】:

  • 不完全清楚你想做什么,但如果你想实例化一次 params 映射,为什么不让它成为一个成员变量呢?还是在一个方法中实例化它,比如checkParams() 并将其传递给其他方法(checkSession、createPass)?
  • 感谢您的回复,我的意思是我有 30 多个方法,并且对于每个方法,我都会得到不同的参数,在每个方法中我初始化 Map,是否有任何方法可以渲染函数来提供所有这些参数作为这个元素的 agruments 和返回映射?
  • 如果你不介意使用guava,你可以试试ImmutableMap.of。它允许您像ImmutableMap.of("param1", "value1", "param2", "value2"); 这样在一行中创建地图。

标签: java methods parameters


【解决方案1】:

我认为你可以在这里做的最好的事情是这样的:

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&lt;String, Object&gt; 并让log 方法解决如何将其打印到日志中。大概用String.valueOf()

【讨论】:

    猜你喜欢
    • 2010-09-22
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 2022-01-05
    • 2012-10-19
    • 2016-12-08
    相关资源
    最近更新 更多