0

我想在我的 Application 中使用反射 API。我有一个接口及其实现类,所有方法声明如图所示。

请让我知道如何对上述代码使用反射。

我已经开始编写客户端类,但我不确定这是否正确??请让我知道如何调用该方法

请帮助我

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

我可以看到您的接口 extends 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

login(String message) 是您示例中的实例方法;如果不首先创建 CodeHandler 的实例,您就无法调用它(请参阅 Saintali 的答案以了解如何)。如果您声明该方法是静态的,那么您可以通过以下方式调用它:

method.invoke(null, message);

有关详细信息,请参阅方法 API 。

于 2012-09-17T15:26:49.413 回答
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 回答
0

在您提到的评论中,您只想在类 CodeHandler 中调用方法登录。所以你不应该使用反射,而是这样做:

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 回答