【问题标题】:Pass arguments of current executing function to other function dynamically将当前执行函数的参数动态传递给其他函数
【发布时间】:2019-02-11 09:26:16
【问题描述】:

片段 1

public static String formatDateToString(BigDecimal param1, Date param2, String param3) {
    Utils.checkNullOrEmpty(?????); //I want the function params here dynamically

}

片段 2

public static boolean checkNullOrEmpty(Object...values){
    for(Object value: values){
        if(value==null){
            return true;
        }
        if(value instanceof String){
            String val = (String) value;
            if(val.isEmpty()){
                return true;
            }
        }
    }
    return false;
}   

如何动态获取当前函数的参数。 (参考片段1)

这将有助于具有许多参数的函数避免单独的空检查。

我可以使用

获取参数类型
new Object(){}.getClass().getEnclosingMethod().getParameterTypes()

缺点是它创建了一个新对象并且只给我类型而不是值。

【问题讨论】:

  • 旁注:null 这样的检查很少是最佳实践。相反,只需使用给定的参数值,并彻底测试以确保 nulls 不会传递给方法(这将导致 NPE)。将null 传递给不期望它的东西是编码错误,而不是运行时错误;运行时检查是针对运行时错误。

标签: java methods reflection parameters


【解决方案1】:

Java 没有与 JavaScript 的 arguments 对象等效的对象,反射也不提供此信息。但是由于参数列表规定了您将收到哪些参数,因此只需直接使用参数即可:

public static String formatDateToString(BigDecimal param1, Date param2, String param3) {
    Utils.checkNullOrEmpty(param1, param2, param3);
}

是的,这确实意味着重复参数名称,但您无法避免。

【讨论】:

  • 这是显而易见的方式,你的意思是不列出所有参数就没有其他可能的传递参数了吗?
  • @Vamsidhar - 对。
  • 附加说明,如果您有这么多参数,那么这样列出它们就会成为问题,无论如何您都应该重新考虑您的设计。甚至最好使用显式语句而不是一次使用所有方法的方法,即Objects.requireNonNull(param1, "param1"); Objects.requireNonNull(param2, "param2"); Objects.requireNonNull(param3, "param3");,它的优点是产生有用的异常消息。而且它不需要任何循环逻辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-05
  • 1970-01-01
  • 2014-06-04
  • 2020-03-04
相关资源
最近更新 更多