我有以下方法签名:
public synchronized List<Bet> acceptTheBets(Double[] odds, BrokerState bs)
我正在尝试使用反射来调用此方法,但是我得到以下异常:
java.lang.NoSuchMethodException: regions.BettingCenter.acceptTheBets([D,entities.BrokerState)
为什么会导致NoSuchMethodException
?
答案 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。看起来你传递的参数类型错误。