使用groovy评估Java表达式

时间:2018-09-06 14:05:12

标签: java groovy

使用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

1 个答案:

答案 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();,则可能是您不想执行的操作。通常,接受用户输入以执行动态代码使您的系统成为各种攻击的简单目标。