【问题标题】:Reflection - Invoke method with Long and Number args [duplicate]反射 - 使用 Long 和 Number 参数调用方法 [重复]
【发布时间】:2018-07-31 06:43:20
【问题描述】:

我在一个名为 NumberToStringConverter 的类中有以下方法:

public String convert(Number input) {
  return String.valueOf(input);
}

我想用下面的代码调用方法:

NumberToStringConverter obj = new NumberToStringConverter();
Method m = obj.getClass().getMethod("convert", new Class[] { Long.class });
m.invoke(obj, new Object[] { aLongObject });

问题是,我收到以下错误:

java.lang.NoSuchMethodException: NumberToStringConverter.convert(java.lang.Long) 

当您编写自己的代码时,Java 允许调用具有 Number 参数和 Long 参数的方法。它会自动将 Long 转换为 Number 对象。为什么这种匹配不会发生在反射中?我怎样才能让它发挥作用?

【问题讨论】:

    标签: java methods reflection


    【解决方案1】:

    您应该匹配您的方法签名(参数类型)。

    改变

    Method m = obj.getClass().getMethod("convert", new Class[] { Long.class });
    

    Method m = obj.getClass().getMethod("convert", new Class[] { Number.class });
    

    【讨论】:

      【解决方案2】:

      使用 Number.class

      NumberToStringConverter obj = new NumberToStringConverter();
      Method m = obj.getClass().getMethod("convert", new Class[] { Number.class });
      m.invoke(obj, new Object[] { aLongObject });
      

      【讨论】:

        【解决方案3】:

        您可以尝试像这样更改您的方法:

        public String convert(Long input) {
          return String.valueOf(input);
        }
        

        或者改变对方法的调用:

        Method m = obj.getClass().getMethod("convert", new Class[] { Number.class });
        

        【讨论】:

          猜你喜欢
          • 2013-02-20
          • 1970-01-01
          • 2011-01-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多