Java 变量args反射方法调用

Java 变量args反射方法调用,java,methods,reflection,invoke,variadic-functions,Java,Methods,Reflection,Invoke,Variadic Functions,用户将键入要调用的方法及其参数。i、 e: 函数1参数1 函数2参数1参数2 函数n参数1参数2。。paramN 假设所有参数都是字符串,我将用户的所有输入保存在字符串堆栈中: LinkedList<String> stack = new LinkedList<String>(); 我缺少调用堆栈中剩余变量args的方法的部分。有什么帮助吗?objClass.getDeclaredMethod(stack.pop())将返回一个方法,该方法的名称由stack.pop

用户将键入要调用的方法及其参数。i、 e:

  • 函数1参数1
  • 函数2参数1参数2
  • 函数n参数1参数2。。paramN
假设所有参数都是字符串,我将用户的所有输入保存在字符串堆栈中:

LinkedList<String> stack = new LinkedList<String>();

我缺少调用堆栈中剩余变量args的方法的部分。有什么帮助吗?

objClass.getDeclaredMethod(stack.pop())
将返回一个方法,该方法的名称由
stack.pop()
返回,并且不带任何参数

要正确使用
getDeclaredMethod(字符串名称、类…参数类型)
您需要传递方法名称和正确数量的类对象,您传递的是类字符串的对象

正确的方法是:-

    LinkedList<String> stack = new LinkedList<String>();
    SpreadSheet myClass = new SpreadSheet();
    Class objClass = myClass.getClass();
    String methodName = stack.pop();
    Class<String>[] parameterTypes = new Class[stack.size()];
    java.util.Arrays.fill(parameterTypes,String.class);  // fill the array with String.class Object
    Method meth1 = objClass.getDeclaredMethod(methodName, parameterTypes);
    meth1.invoke(myClass, stack.toArray());
LinkedList堆栈=新建LinkedList();
电子表格myClass=新电子表格();
类objClass=myClass.getClass();
String methodName=stack.pop();
Class[]parameterTypes=新类[stack.size()];
java.util.Arrays.fill(parameterTypes,String.class);//用String.class对象填充数组
方法meth1=objClass.getDeclaredMethod(方法名,参数类型);
meth1.invoke(myClass,stack.toArray());

Oracle的java反射教程:看起来您缺少调用该方法的对象引用。您需要调用
meth1.invoke(objectWithThatMethod,参数)
其中在静态方法的情况下
objectWithThatMethod
可以是
null
。现在您只需创建
Object[]arguments
数组,并用堆栈中的其余元素填充它。这应该没那么难,因为您知道堆栈的
size()
。@adrian objClass.getDeclaredMethod(stack.pop());将永远不会工作,您只传递方法名,您还需要传递类对象以缩小方法的范围。请弹出堆栈两次,不要使用方法名。@pinkiewirl复制该名称:)
    LinkedList<String> stack = new LinkedList<String>();
    SpreadSheet myClass = new SpreadSheet();
    Class objClass = myClass.getClass();
    String methodName = stack.pop();
    Class<String>[] parameterTypes = new Class[stack.size()];
    java.util.Arrays.fill(parameterTypes,String.class);  // fill the array with String.class Object
    Method meth1 = objClass.getDeclaredMethod(methodName, parameterTypes);
    meth1.invoke(myClass, stack.toArray());