2017-04-09 32 views
0

我需要幫助。用戶提供方法,其參數爲一個字符串。我的代碼需要運行這個方法。Java供應商/消費者/可運行?當它作爲字符串參數提供時如何調用方法

我們如何使用Supplier/Consumer/Runnable來實現這一目標。這可以使用反射來完成,但我想避免它。

import java.util.Scanner; 

public class InvokeStringArgument{ 
    public static Supplier<String> invokeMe(String returnStr){ 
     return new Supplier<String>(){ 
      public String get(){ 
       System.out.println("Success"); 
       return returnStr; 
      } 
     }; 
    } 

    public static void main(String[] args){ 
     //invokeMe("MyValue").get(); 

     System.out.println("Please enter method to invoke:"); 
     Scanner sc = new Scanner(System.in); 
     String methodName = sc.next(); 
     //Need a code which will run the method when passed as a string 
     //For example user input it as invokeMe("MyValue") 
    } 
} 
+0

您是否在尋找'invokeMe(方式)獲得()'?或者你是否想讓用戶_name method_並且有某種方法? (這將需要反思,它會很糟糕。) –

+0

我想'當invokeMe(「MyValue」)'作爲外部源字符串提供時,它應該被調用併成功運行。 – NoviceUser

+0

_應該調用什麼?用戶是否自己寫了字符串'「invokeMe(\」MyValue \「)」'? (這很難做;你將不得不自己解析輸入。) –

回答

0

好吧,今天有一些時間來看看這些待定的事情。此時達成的解決方案符合我的要求。二手的BeanShell和反思來完成這件事,如下

package beanshell; 

import java.util.Scanner; 
import java.util.function.Supplier; 

import bsh.EvalError; 
import bsh.Interpreter; 

public class InvokeStringArgument{ 
    public static Supplier<String> invokeMe(String returnStr){ 
     return new Supplier<String>(){ 
      public String get(){ 
       System.out.println("Success: Received string '"+returnStr+"'"); 
       return returnStr; 
      } 
     }; 
    } 

    public static void main(String[] args) throws EvalError { 
     //invokeMe("MyValue").get(); 

     System.out.println("Please enter string to evaluate:"); 
     Scanner sc = new Scanner(System.in); 
     String userInput = sc.next(); 

     Interpreter i = new Interpreter(); 

     Object evalSource = i.eval("public class EvalUserInput extends beanshell.InvokeStringArgument{" 
       + "public void evaluserInput(){" 
       + userInput+"" 
       + "}" 
       + "}"); 
     try{ 
      Class<?> noparams[] = {}; 
      Class<?> cls = (Class) evalSource; 
      Object obj = cls.newInstance(); 
      cls.getDeclaredMethod("evaluserInput", noparams).invoke(obj, null); 
     } catch(Exception e){ 

     } 
    } 
} 

從控制檯:

Please enter string to evaluate: 
invokeMe("MyValue").get(); 
Success: Received string 'MyValue' 
相關問題