使用Java呼叫JS
阿新 • • 發佈:2018-11-26
import junit.framework.TestCase; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; import javax.swing.JButton; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.stream.Collectors; public class CallJs extends TestCase { public void testConsoleLog() throws ScriptException { ScriptEngine engine = new ScriptEngineManager().getEngineByExtension("js"); //此處會丟擲異常,Java的script引擎並不包含console物件 engine.eval("console.log('hello world')"); } public void testConsoleLog2() throws ScriptException { ScriptEngine engine = new ScriptEngineManager().getEngineByExtension("js"); engine.put("console", System.out); //此處會丟擲異常,Java的script引擎並不包含console物件 engine.eval("console.println('hello world')"); } public void testUseJsFunction() throws ScriptException { ScriptEngine engine = new ScriptEngineManager().getEngineByExtension("js"); engine.eval("function add(x,y){return x+y}"); Object value = engine.eval("add(3,7)"); System.out.println(value.getClass() + " " + value); } /** * 注意,這個內部類必須是public否則js編譯器看不見 */ public class SubWrapper { public int sub(int x, int y) { return x - y; } } public void testUseJsFile() throws IOException, ScriptException { ScriptEngine engine = new ScriptEngineManager().getEngineByExtension("js"); InputStream cin = getClass().getResourceAsStream("/calljs.js"); InputStreamReader reader = new InputStreamReader(cin); engine.put("subWrapper", new SubWrapper()); engine.eval(reader); engine.put("console", System.out); System.out.println(engine.eval("add(3,4)")); System.out.println(engine.eval("sub(5,6)")); } public void testUpdateJavaObject() throws ScriptException { JButton button = new JButton(); ScriptEngine engine = new ScriptEngineManager().getEngineByExtension("js"); engine.put("button", button); engine.eval("button.text='hello world'"); System.out.println(button.getText()); } public void testlistAllScriptEngine() { //列出全部指令碼引擎 new ScriptEngineManager().getEngineFactories().forEach(fac -> { System.out.println("name " + fac.getEngineName() + "\nlanguage " + fac.getLanguageName() + "\nversion " + fac.getEngineVersion() + "\nlanguageVersion " + fac.getLanguageVersion() + "\nextensions " + fac.getExtensions().stream().collect(Collectors.joining(",")) + "\nmimetypes " + fac.getMimeTypes().stream().collect(Collectors.joining(",")) + "\n" ); }); } }
js
function add(x, y) {
return x + y
}
function sub(x,y){
return subWrapper.sub(x,y)
}