2015-10-19 1 views
1

Пользователь вводит вызываемый метод и его аргументы. то есть:Переменный метод отражения args invoke

  • function1 param1
  • function2 param1 param2
  • functionN param1 param2 .. paramN

Предполагая, что все параметры строки, я сохраняю все вход пользователя в стеке строк :

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

И затем, с помощью отражения я получаю метод:

SpreadSheet myClass = new SpreadSheet(); 
Class objClass = myClass.getClass(); 
Method meth1 = objClass.getDeclaredMethod(stack.pop()); 

Мне не хватает части вызова метода с переменными args, оставшимися в стеке. Любая помощь ?

+0

Java-отражение учебник по Oracle: https://docs.oracle.com/javase/tutorial/reflect/member/methodInvocation.html –

+0

Похоже, вам не хватает ссылки на объект, где вызывается метод. –

+0

Вам нужно вызвать 'meth1.invoke (objectWithThatMethod, arguments)', где в случае статического метода 'objectWithThatMethod' может быть' null'. Теперь вам просто нужно создать массив 'Object [] arguments' и заполнить его остальными элементами из вашего стека. Это не должно быть так сложно, поскольку вы знаете 'size()' стека. – Pshemo

ответ

1

objClass.getDeclaredMethod(stack.pop()); вернет метод, который имеет имя, возвращаемое stack.pop() и которое не принимает аргументов.

Для правильного использования getDeclaredMethod(String name, Class<?>... parameterTypes) вам нужно передать имя метода и правильное количество объектов класса, вы передаете объекты класса String,

Правильный путь будет: -

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()); 
+1

Вы дважды выкладываете стек и не используете имя метода. –

+0

@PinkieSwirl Скопируйте это :) –

 Смежные вопросы

  • Нет связанных вопросов^_^