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;
}
関数を呼び出すコードは次のとおりです(関数名にはprocedure [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
では、なぜパラメーターなしでプロシージャーを呼び出すことができるのに、パラメーターに問題があるのでしょうか。
ありがとう
問題は、CarPark.in
取得しようとしているバージョンがプリミティブ整数getDeclaredMethod
を取りjava.lang.Integer
、同じものではない、をとるバージョンを探していることです。int.class
またはInteger.TYPE
に渡すとgetDeclaredMethod
、メソッドを正しく見つけることができることがわかります。
完全なコードを見ずに、自分に合った解決策を提案するのは少し難しいことではありませんが、プリミティブタイプとそれに相当するボックス化されたタイプの違いに留意し、自動ボックス化に注意してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加