package com.test;
import java.util.HashMap;
import java.util.Map;
import javax.script.Bindings;
import javax.script.Compilable;
import javax.script.CompiledScript;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class Test1 {
private static ScriptEngine engine = null;
public static final String PREFIX = "_math";
private Map<String, String> scriptName = new HashMap<String, String>();
//每次编译都有一个脚本引擎, 方便以后单独对某个函数进行编译
public void compile(String functionName, String script)
throws ScriptException {
ScriptEngineManager engineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = engineManager.getEngineByName("js");
ScriptEngine engineTemp = scriptEngine;
Compilable compilable = (Compilable) engineTemp;
CompiledScript compiledScript = compilable.compile(script);
compiledScript.eval();
engine.put(functionName, engineTemp.get(functionName));
engine.eval(PREFIX + "." + functionName + "=" + functionName + ";");
}
private void init() {
scriptName.put("add", "function add(a,b) {return a + b};");
scriptName.put("sub", "function sub(a,b) {return a - b};");
ScriptEngineManager engineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = engineManager.getEngineByName("js");
engine = scriptEngine;
try {
engine.eval(" var " + PREFIX + " = new Object();");
for (Map.Entry<String, String> script : scriptName.entrySet()) {
compile(script.getKey(), script.getValue());
}
} catch (ScriptException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws ScriptException {
Test1 test1 = new Test1();
ScriptEngineManager engineManager = new ScriptEngineManager();
ScriptEngine scriptEngine2 = engineManager.getEngineByName("js");
test1.init();
//使用了一个新的引擎
scriptEngine2.put(PREFIX, engine.get(PREFIX));
scriptEngine2.eval("print(_math.add(1,5));");
scriptEngine2.eval("print(_math.sub(1,5));");
test1.compile("add", "function add(a,b){return 0;}");
scriptEngine2.eval("print(_math.add(1,5));");
scriptEngine2.eval("print(_math.sub(1,5));");
// Bindings bindings = scriptEngine2.getBindings(ScriptContext.ENGINE_SCOPE);
// bindings.put("test", new Test()); 均可以将一个类对象放在引擎中,调用类中的方法
scriptEngine2.put("test", new Test());
scriptEngine2.eval("print(test.print('AAAA'));");
}
//输出结果 : 6-40-4AAAA
}
package com.test;
public class Test {
public String print(String word) {
return word;
}
}