0

アプリケーションでReflectionAPIを使用したい。インターフェイスとその実装クラスがあり、すべてのメソッド宣言が示されています。

上記のコードにReflectionを使用する方法を教えてください。

クライアントクラスを書き始めましたが、これが正しいかどうかわかりませんか?メソッドを呼び出す方法を教えてください

で私を助けてください

public interface DataHandler extends Remote {

    public abstract String logon(String  message) throws RemoteException;
    public abstract String logoff(String message) throws RemoteException;
    public abstract String userinformation(String message) throws RemoteException;
    public abstract String updateUser(String message) throws RemoteException; 
}

そして、示されている上記のインターフェースの実装クラス

public class CodeHandler implements DataHandler
{
    public  String logon(String  message) throws RemoteException {}
    public  String logoff(String  message) throws RemoteException {}
    public  String userinformation(String  message) throws RemoteException {}
    public  String updateUser(String  message) throws RemoteException {}
}

示されているようにクライアントクラスがあります

public class Client
{
    public static void main(String args[])
    {
        callMethod("logon"); 
    }

    private Object callMethod(String  message) {
        String methodName = message ;
        Method method = DataHandler.class.getDeclaredMethod(methodName, null);
        method.setAccessible(true);
        // How to use method.invoke in this case ??
    }
}
4

4 に答える 4

2

インターフェイスが拡張されていることがわかります。java.rmi.Remoteここではリフレクションの代わりにRMI機能を使用する必要があると思いますが、本当にリフレクションを使用する必要がある場合は、次のようにしてみてください。

private Object callMethod(CodeHandler codeHandler, String methodName, String message) {
    try {
        Method method = DataHandler.class.getDeclaredMethod(methodName, String.class);
        method.setAccessible(true);

        return method.invoke(codeHandler, message);
    } catch (NoSuchMethodException e) {
        handle(e);
    } catch (IllegalAccessException e) {
        handle(e);
    } catch (InvocationTargetException e) {
        handle(e);
    }
}
于 2012-09-17T15:25:27.027 に答える
1
   private Object callMethod(String methodName, CodeHandler object, String strParamForMethod)
   {
      try
      {
         Method method = DataHandler.class.getDeclaredMethod(methodName, null);
         method.setAccessible(true);
         method.invoke(object, strParamForMethod);
      }
      catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e)
      {
      }
   }
于 2012-09-17T15:22:52.320 に答える
1

login(String message)は、この例のインスタンスメソッドです。最初にCodeHandlerのインスタンスを作成せずに呼び出すことはできません(方法については、Saintaliの回答を参照してください)。メソッドを静的であると宣言する場合は、次の方法で呼び出すことができます。

method.invoke(null, message);

詳細については、メソッドAPIを参照してください。

于 2012-09-17T15:26:49.413 に答える
0

コメントで、CodeHandlerクラスのlogonメソッドを呼び出したいだけだとおっしゃいました。したがって、リフレクションは使用しないでください。ただし、次のようにしてください。

public class Client {

   public static void main(String args[]) {
      callMethod("logon"); 
   }

   private Object callMethod(String  message) {
      CodeHandler codeHandler = new CodeHandler();
      codeHandler.logon(message);
   }
}
于 2012-09-17T15:25:38.747 に答える