文件目录:StringFunction.java,字符串功能类StringNashorn.java,封装脚本引擎NashornTest.java,测试引擎,引擎调用
StringFunction.java源码:
public class StringFunction {
/**
* 字符串截取
*/
public String sub(String str, int start, int end) {
return str.substring(start, end);
}
/**
* 字符串拼接
*/
public String append(String... strs) {
StringBuilder result = new StringBuilder(strs[0]);
Stream.of(strs).skip(1).forEach(str -> result.append(str));
return result.toString();
}
}
StringNashorn.java源码:
public class StringNashorn {
/**
* Nashorn脚本引擎
*/
private ScriptEngine nashorn = new ScriptEngineManager().getEngineByName("nashorn");
/**
* 执行脚本
*/
public Object execute(String script) {
ScriptContext scriptContext = new SimpleScriptContext();
// 定义一个名为stringfunction的函数,这个函数实际对应着一个StringFunction对象
scriptContext.setAttribute("stringfunction", new StringFunction(), 100);
nashorn.setContext(scriptContext);
Object result = null;
try {
result = nashorn.eval(script);
} catch (ScriptException e) {
e.printStackTrace();
}
return result;
}
}
NashornTest.java源码:
public class NashornTest {
public static void main(String[] args) {
String substring = "stringfunction.sub(\"abcdefghijk\", 1, 4);";
String append = "stringfunction.append(\"abc\", \"def\");";
StringNashorn nashorn = new StringNashorn();
Object subResult = nashorn.execute(substring);
Object appendResult = nashorn.execute(append);
System.out.println(subResult.toString());
System.out.println(appendResult.toString());
}
}
运行main方法,运行结果:
bcd
abcdef
这里如果
NashornTest.java改写如下:
public class NashornTest {
public static void main(String[] args) {
// 脚本内用对象接收结果并打印
String substring = "var s1 = stringfunction.sub(\"abcdefghijk\", 1, 4);"
+ " print(s1);";
String append = "var s2 = stringfunction.append(\"abc\", \"def\");"
+ " print(s2);";
StringNashorn nashorn = new StringNashorn();
// 这里execute不再返回对象,因为在脚本里面已经有对象接收sub和append的执行结果。
nashorn.execute(substring);
nashorn.execute(append);
}
}
同样也会输出相同的结果。