Method.Invoke不知道参数

时间:2015-10-22 20:15:03

标签: java

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

此外,我在C#中做到了这一点并且很简单,并且不需要我说明参数,但这是用Java编写的。

以下是执行Invoke的代码:

    <appl-list ng-if="show==='List'></appl-list>

    <appl-map ng-if="show==='Map'></appl-map>

那么在获取方法时如何在不说明参数的情况下,使用不同的参数调用不同的方法。

这是可行的C#版本:

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());
        }
    }

2 个答案:

答案 0 :(得分:1)

java.lang.reflect.Method的实例反映了具体的方法。每个都与特定的类相关联,具有特定的参数列表,并具有特定的返回类型。当方法重载正在进行时,每个重载方法将由不同的Method对象反映出来;这些是不可互换的。

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

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

如果不同的重载由不同数量的参数区分,或者如果您需要考虑的参数类型模式有特定限制,那么您可以稍微改进重载方法,同时保留您的理智,但此时您真的应该问自己是否有更好的方法。这种设计绝对会引起麻烦。

答案 1 :(得分:0)

我找到了解决方案。我创建了一个函数来获取预期的参数,这些参数是字符串并将它们转换为数据类型,具体取决于它是浮点数,整数还是字符串。然后我将其发送到另一个方法,该方法获取类中的所有方法并获取具有我试图调用的方法名称的方法,然后获取具有我在第一个方法返回的object []中具有的数据类型的方法。然后我使用我得到的方法和转换后的数据类型来调用方法。