Java 变量args反射方法调用
用户将键入要调用的方法及其参数。i、 e: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
- 函数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());