使用带有Double []的java反射作为参数时获取noSuchMethodException

时间:2018-05-02 08:45:53

标签: java

我有以下方法签名:

public synchronized List<Bet> acceptTheBets(Double[] odds, BrokerState bs)

我正在尝试使用反射来调用此方法,但是我得到以下异常:

  

java.lang.NoSuchMethodException:   regions.BettingCenter.acceptTheBets([D,entities.BrokerState)

为什么会导致NoSuchMethodException

2 个答案:

答案 0 :(得分:1)

以下是有关如何使用此

的快速示例
public class A {
    public static void main(String[] args) {
        try {
            Object a = new double[]{1.0, 2.0};
            System.out.println(A.class.getMethod("getStrings", double[].class).invoke(new A(), a));
        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public synchronized List<String> getStrings(double[] array){
        return DoubleStream.of(array).boxed().map(d -> "" + d).collect(Collectors.toList());
    }

}

请注意Object用于防止a被视为varargs的2参数。此外,您需要传递一个实例来调用其中的方法。

这也适用于Double[],但需要传递特定类型Double[].class才能获得正确的方法。

public String getStrings(double[] array){
    return "double[]";
}

public String getStrings(Double[] array){
    return "Double[]";
}

将通过以下方式调用:

//double[]
A.class.getMethod("getStrings", double[].class)
    .invoke(new A(), (Object)new double[]{1.0, 2.0}));

//Double[]
A.class.getMethod("getStrings", Double[].class)
    .invoke(new A(), (Object)new Double[]{1.0, 2.0}));

注意传递的类型和参数的差异。

答案 1 :(得分:1)

[D double[]不是Double[]。检查https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.3.2。看起来你传递的参数类型错误。