使用groovy评估Java表达式越来越困难。 下面是我的代码,我必须在其中动态推送替换语句并对其进行评估。 replaceSpecialChars值来自用户输入。
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("groovy");
String text = "Disa";
System.out.println(text); //1
text = text.replace("s", "");
System.out.println(text); //2
String removeSpecialChars = ".replace('a','')";
text = text + removeSpecialChars;
System.out.println(text); //3
engine.put("first", text);
System.out.println(engine.eval("first")); //4
4个Sysout输出-
Disa
Dia
Dia.replace('a','')
Dia.replace('a','')
预期的输出-
Disa
Dia
Dia.replace('a','')
Di
答案 0 :(得分:1)
您应该可以执行以下操作:
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("groovy");
removeSpecialChars = ".replace('a','')";
text = "Dia";
engine.put("first", text);
result = engine.eval("first" + removeSpecialChars);
System.out.println(result);
通过调用engine.put("first", text);
,您将创建一个变量first
,其字符串为Dia.replace('a','')
作为值。评估此变量只是一个简单的操作,这就是为什么您再次获得与结果相同的值的原因。
您还可以将以上内容缩短为
result = engine.eval("\"" + text + "\"" + removeSpecialChars);
在glot.io上试用:https://glot.io/snippets/f4jyrbt92h
但是,您应该对允许的操作非常小心,并需要确保恶意用户输入不会破坏您的整个系统。例如,如果用户输入为.replace('a',''); file("C:/Windows/").delete();
,则可能是您不想执行的操作。通常,接受用户输入以执行动态代码使您的系统成为各种攻击的简单目标。