Java供应商/消费者/可运行?当方法作为字符串参数提供时,如何调用该方法
我需要帮助。用户将参数作为字符串提供给方法。我的代码需要运行这个方法 我们如何使用供应商/消费者/Runnable实现这一目标。这可以使用反射来完成,但我想避免它Java供应商/消费者/可运行?当方法作为字符串参数提供时,如何调用该方法,java,Java,我需要帮助。用户将参数作为字符串提供给方法。我的代码需要运行这个方法 我们如何使用供应商/消费者/Runnable实现这一目标。这可以使用反射来完成,但我想避免它 import java.util.Scanner; public class InvokeStringArgument{ public static Supplier<String> invokeMe(String returnStr){ return new Supplier<String
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")
}
}
import java.util.Scanner;
公共类InvokeStringArgument{
公共静态供应商invokeMe(字符串returnStr){
退回新供应商(){
公共字符串get(){
System.out.println(“成功”);
返回返回str;
}
};
}
公共静态void main(字符串[]args){
//invokeMe(“MyValue”).get();
System.out.println(“请输入要调用的方法:”);
扫描仪sc=新的扫描仪(System.in);
String methodName=sc.next();
//需要一个当作为字符串传递时将运行该方法的代码
//例如,用户将其输入为invokeMe(“MyValue”)
}
}
好的,今天有时间调查这些悬而未决的事情。实现了符合我要求的解决方案。使用BeanShell和reflection完成此操作,如下所示
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){
}
}
}
您正在查找
invokeMe(methodName).get()
?或者你是想让用户名成为方法,而某个地方有某种方法?(这将需要反射,而且会很恶心。)我希望当invokeMe(“MyValue”)
作为字符串从外部源提供时,它应该被调用并成功运行。应该调用什么?用户是否自己编写字符串“invokeMe(\“MyValue\”)
?(这将非常困难;您必须自己分析输入。)是的,用户自己将字符串“invokeMe(\“MyValue\”)作为字符串参数写入其他方法。请仅在100%信任用户的情况下使用此解决方案,因为它允许运行任何代码,包括恶意代码。
Please enter string to evaluate:
invokeMe("MyValue").get();
Success: Received string 'MyValue'