java - Method.Invoke 不知道参数

标签 java

我在java中使用Method.Invoke来动态调用另一个类中的方法。唯一的问题是,如果方法有参数,我需要在 class.getDeclaredMethod("method", Something.class) 中启动它,否则它不会看到这些方法。问题是我不知道调用方法时参数是什么。我该如何解决这个问题?

我也在 C# 中完成了此操作,它很简单,不需要我声明参数,但这是在 Java 中完成的。

这是执行调用的代码:

public void DoCommand(String msg){
        System.out.println(msg);
        String[] temp = msg.split(" ");
        String command = temp[0];

        Class c = commander.getClass();

        try {
            Object obj = c.newInstance();
            try {
                System.out.println("'" + command + "'");
                Method method = c.getDeclaredMethod(command);

                Object[] pars = new Object[temp.length];
                for(int i = 0; i < pars.length; i++){
                    pars[i] = temp[i + 1];
                }

                if((String)pars[pars.length - 1] == null){
                    pars[pars.length - 1] = socket;
                }

                Parameter[] paramaters = method.getParameters();
                Object[] endParameters = AltimitConverter.ConvertParameters(pars, paramaters);

                try {
                    method.invoke(obj, endParameters);
                } catch (IllegalArgumentException e) {
                } catch (IllegalAccessException e) {
                } catch (InvocationTargetException e) {}
            }catch (NoSuchMethodException e){
                System.out.println(e.toString());
            }
        }catch (Exception e){
            System.out.println(e.toString());
        }
    }

那么如何在获取方法时不声明参数的情况下调用不同参数的不同方法呢?

这是可以运行的 C# 版本:

private static void DoCommand(string msg, Socket soc){
        string[] temp = msg.Split (' ');
        string command = temp [0];

        Type type = commandObject.GetType ();
        MethodBase commandFunction = type.GetMethod (command);

        if (commandFunction != null) {
            object[] pars = new object[temp.Length - 1];
            for (int i = 0; i < pars.Length; i++) {
                pars [i] = temp [i + 1];
            }

            if ((string)pars [pars.Length - 1] == "") {
                pars [pars.Length - 1] = soc;
            }


            ParameterInfo[] paramaters = commandFunction.GetParameters ();
            object[] endParamaters = AltimitConverter.ConvertParams (pars, paramaters);

            if (commandFunction != null) {
                try {
                    commandFunction.Invoke (commandObject, endParamaters);
                } catch (Exception e) {
                    Debug.Log (e);
                }
            } else {
                Debug.Log ("commandFunction is null");
            }
        }
    }

最佳答案

java.lang.reflect.Method 的实例反射(reflect)特定的方法。每一个都与特定的类相关联,具有特定的参数列表,并且具有特定的返回类型。当方法重载发生时,每个重载的方法将由一个不同的 Method 对象反射(reflect);这些是不可互换的。

如果您需要考虑在重载方法中进行选择,那么您只能引用预期参数的数量和类型来执行此操作。如果您必须依赖参数本身来确定匹配的参数类型,那么您就会看到重复的 Java 方法解析逻辑,这很复杂。

如果您只需要担心查找主题类本身声明的非重载方法(即不是继承的),那么您可以在 Class 上调用 getDeclaredMethods() 对象并扫描 Method 对象的结果数组,以查找具有正确名称的对象。

如果不同的重载通过不同数量的参数来区分,或者如果您需要考虑的参数类型模式有特定的限制,那么您可以在保持理智的同时深入了解重载方法,但此时您确实应该问自己是否有更好的方法。这种设计绝对是自找麻烦。

关于java - Method.Invoke 不知道参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33289875/

相关文章:

java - 如何连接EJB、REST和Client?

java - 如何将每个数字打印到一定数量

java - 更改后 JLabel 图标不显示

java - Hadoop MapReduce 查询大型 json 数据

Java 将 ISO-8859-1 转换为 UTF-8

java - 了解 java 日志文件

java - (onItemClick) 显示 ListView 中的 Json 数据 - Android

java - Spring : adding params for router

Java 并发 - 中断策略

java - 我正在用 java 编写一个日历程序,但除了 2015 年 10 月之外,月份不匹配,我需要帮助