2015-10-19 115 views
1

用戶將鍵入要調用的方法及其參數。即:變量參數反射方法調用

  • 功能1的param1
  • 函數2的param1 param2的
  • 功能N的param1 param2的.. paramN

假設所有參數都是字符串,我保存的用戶的所有輸入在字符串堆棧:

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

然後,使用反射我得到的方法:

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

我錯過了在棧中保留變量參數的方法調用方法。任何幫助?

+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)你需要傳遞的方法名稱和類對象的正確數量,你逝去的類字符串

的對象的正確方法是: -

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複製:) –