getDeclaredMethod抛出异常

时间:2014-06-11 19:33:57

标签: java exception parameters rpc

我想编写一个通过rpc进行通信的客户端服务器应用程序。代码适用于没有参数的函数。但是,当我尝试使用单个参数调用函数时(不支持更多),它会给我一个“NoSuchMethodException”。

以下是重要部分:

我想要调用的函数: (rpcserver.CarPark.in)

public boolean in(int num) {
    if(!closed) {
        if (num <= (maxLots - curLots)) {
            curLots += num;
            return true;
        }
    }
    return false;
}    

public boolean in() {
    if(!closed) {
        if (curLots < maxLots) {
            curLots += 1;
            return true;
        }
    }
    return false;
}    

以下是调用函数的代码: (我使用过程[0]作为函数名称,[1]作为参数。

    if(procedure.length == 1) {
        try {
            Method method = CarPark.class.getDeclaredMethod((String)procedure[0]);
            return method.invoke(park);  
        } catch (Exception e) {
            throw new Exception("Server couldn't find a fitting procedure.");                
        }
    } else {
        // length of 2, more isn't possible
        try {
            System.out.println((String)procedure[0] + ", " +  procedure[1].getClass());
            Method method = CarPark.class.getDeclaredMethod((String)procedure[0], procedure[1].getClass());
            return method.invoke(park,procedure[1]);  
        } catch (Exception e) {
            throw new Exception("Server couldn't find a fitting procedure." + e);                
        }
    }

奇怪的是,这个函数回归了这个:java.lang.NoSuchMethodException: rpcserver.CarPark.in(java.lang.Integer) 但是,println命令给了我:in, class java.lang.Integer

那么为什么我可以调用没有参数但是参数有问题的程序?

由于

1 个答案:

答案 0 :(得分:1)

问题在于,您尝试获取的CarPark.in版本采用原始整数,而getDeclaredMethod正在寻找采用java.lang.Integer的版本,而不是int.class同一件事情。如果您将Integer.TYPEgetDeclaredMethod传递给{{1}},您就会发现它能够正确找到该方法。

如果没有看到您的完整代码并不难以提出适合您的解决方案,请记住基元类型与其盒装等价物之间的区别,并警惕autoboxing。< / p>