import java.io.FileNotFoundException; import java.io.FileReader; import java.util.List; import javax.print.DocFlavor.URL; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; @SuppressWarnings("all") //压制所有的警告 public class Engine_GetRhino { public static void main(String[] args) { // TODO Auto-generated method stub //获得脚本引擎 ScriptEngineManager sem = new ScriptEngineManager(); ScriptEngine engine=sem.getEngineByName("javascript"); //定义变量,存储到引擎的上下文 engine.put("msg", "you are very good"); String str = "var user = {name:'waibizi',age:18,schools:['肇庆学院','计算机学院']};"; str += "print(user.name);"; //执行脚本 try { engine.eval(str); engine.eval("msg='you are very bad';"); } catch (ScriptException e) { // TODO Auto-generated catch block e.printStackTrace(); } //测试输出 System.out.println(engine.get("msg")); try { //定义函数 engine.eval("function add(a,b){var sum = a + b; return sum;}"); engine.eval("function add1(){var sum = 123 + 321; return sum;}"); //执行函数 Invocable jsInvoke = (Invocable) engine; Object result=jsInvoke.invokeFunction("add", new Object[] {15,13}); //指定函数赋值 Object result1=jsInvoke.invokeFunction("add1"); //指定函数赋值 System.out.println(result); System.out.println(result1); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } try { //js导入java的包,使用java的类 // 以下注释掉的代码是JDK1.6的,先已经抛弃了,看下面没注释的 // String jsCode = "importPackage(java.util); var list=Arrays.asList([\"肇庆学院\",\"计算机学院\",\"软件工程\"]);"; String jsCode = "var list=java.util.Arrays.asList([\"肇庆学院\",\"计算机学院\",\"软件工程\"]);"; engine.eval(jsCode); List list = (List) engine.get("list"); for(int i=0;i<list.size();i++) { System.out.println(list.get(i)); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } try { java.net.URL url = Engine_GetRhino.class.getClassLoader().getResource("demo.js"); FileReader fr = new FileReader(url.getPath()); engine.eval(fr); fr.close(); //由于只是测试,就不那么规范了。大家实际用时要使用try catch finally! } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
a.js如下
function test(){ var a=666; print("invoke js file:"+a); } test();