java 6.0提供一些標準接口來操作腳本語言,它讓java有能力在代碼中,動態的執行腳本語言,接口的實現就由第三方來實現。Rhino引擎是一個實現javascript腳本接口的第三方實現,java6.0之後,默認引入,作爲java的jar包。
簡單使用見下面的例子
/**
* RhinoDemo引擎demo
* @author liuxg
* @date 2016年5月24日 上午10:30:37
*/
public class RhinoDemo {
public static void main(String[] args) throws Exception {
ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine se = sem.getEngineByName("javascript");
//使用上下文,執行eval之後,js的變量和函數都存儲於上下文,通過get和put可以獲取和保存變量,java和javascript都可以使用同一個上下文
se.put("myame", "liuxg !!");
System.out.println(se.get("myame"));
se.eval("var yourname = 'who are you ?'");
System.out.println(se.get("yourname"));
//執行變量
String script = "var compo = {addr : \"廣州\",tel : \"12345678901\"};";
script += "println(compo.addr + \" : \" + compo.tel)";
se.eval(script);
//執行js函數
String funscript = "function sum(a,b){return a + b ;}";
se.eval(funscript);
Invocable jsInvocable = (Invocable)se;
Object obj = jsInvocable.invokeFunction("sum", 1,2);
System.out.println("sum = " + obj);
//執行js文件
URL url = RhinoDemo.class.getClassLoader().getResource("rhino.js");//獲取classpath下的js文件
FileReader reader = new FileReader(url.getFile());
se.eval(reader);
Object obj1 = jsInvocable.invokeFunction("skyscolor");
System.out.println(se.get("skycolor") + " -- " + obj1);
//js和java代碼混合用
String jsjavacode = "importPackage(java.util); var names = Arrays.asList(\"liuxg1\",\"liuxg2\",\"liuxg3\")";
se.eval(jsjavacode);
List<String> names = (List<String>) se.get("names");
for (String name : names) {
System.out.println(name);
}
}
}