友情提示
本文主要参考了51CTO上的一篇文章,代码经过自己的模仿和整理,还算凑合。
本文中的代码注释比较多,不再过多解释。
更多用法,还是得看JDK的API或者看原文http://developer.51cto.com/art/201007/208812.htm。
1.可用的脚本引擎
/** * Java内置只支持JavaScript一种脚本 * 打印Script引擎的一些信息 */ public static void printBuildInScriptEngine() { ScriptEngineManager manager = new ScriptEngineManager(); List<ScriptEngineFactory> factories = manager.getEngineFactories(); for (ScriptEngineFactory factory : factories) { println("engine name:" + factory.getEngineName()); println("engine version:" + factory.getEngineVersion()); println("language name:" + factory.getLanguageName()); println("language version:" + factory.getLanguageVersion()); println("names:" + factory.getNames()); println("mime:" + factory.getMimeTypes()); println("extension:" + factory.getExtensions()); } }
2.一个“HelloWorld”程序
/** * 在Java中使用JavaScript的Hello world示例 */ public static void printHelloWorld() { ScriptEngine engine = getJavaScriptEngine(); String helloWorldScript = "print('hello script')"; try { engine.eval(helloWorldScript); } catch (ScriptException e) { e.printStackTrace(); } println(); }
3.方法调用-第1种方式
/** * 可以向脚本中传递变量,使得Java代码可以和脚本代码交互 */ public static void invokeFunction() { ScriptEngine engine = getJavaScriptEngine(); engine.put("a", 13); engine.put("b", 24); try { String maxFunction = JS_MAX_FUNCTION_AND_INVOKE; Object maxNum = engine.eval(maxFunction); println("max:" + maxNum); } catch (Exception e) { e.printStackTrace(); } }
4.方法调用-第2种方式
/** * 方法调用,第2种方式 */ public static void invokeFunction2() { ScriptEngine engine = getJavaScriptEngine(); try { engine.eval(JS_MAX_FUNCTION); Invocable invoke = (Invocable) engine; Object maxNum = invoke.invokeFunction(MAX_FUNCTION_NAME, 88, 99); println(maxNum); maxNum = invoke.invokeFunction(MAX_FUNCTION_NAME, 99, 111); println(maxNum); } catch (Exception e) { e.printStackTrace(); } }
5.方法调用-第3种方式
/** * 方法调用第3种方式 */ public static void invokeFunction3() { ScriptEngine engine = getJavaScriptEngine(); try { engine.eval(JS_MAX_FUNCTION); Invocable invoke = (Invocable) engine; JSLib jslib = invoke.getInterface(JSLib.class); int maxNum = jslib.max(2013, 1989); println(maxNum); } catch (Exception e) { e.printStackTrace(); } }
6.在JavaScript中使用Java对象和方法
/** * 在JavaScript中使用Java对象和方法 */ public static void useJavaObject() { ScriptEngine engine = getJavaScriptEngine(); try { String script = "var list = java.util.ArrayList();list.add('CSDN FanUnion');print(list.get(0));"; engine.eval(script); } catch (Exception e) { e.printStackTrace(); } }
7.编译JS代码,然后执行
/** * 编译JS代码,然后执行 */ public static void compileExecute() { ScriptEngine engine = getJavaScriptEngine(); try { Compilable compEngine = (Compilable) engine; CompiledScript script = compEngine.compile(JS_MAX_FUNCTION); script.eval(); //强制转换,Invocable和Compilable都是脚本引擎可选实现的 //如果这个地方的脚本引擎没有实现这个接口,应该会报错 Invocable invoke = (Invocable) engine; Object maxNum = invoke .invokeFunction(MAX_FUNCTION_NAME, 2020, 2050); println(maxNum); } catch (Exception e) { e.printStackTrace(); } }
8.工具方法和接口
/** * 工具方法:创建JS-引擎 */ private static ScriptEngine getJavaScriptEngine() { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName(JS_ENGINE_NAME); return engine; } public static void println() { System.out.println(); } public static void println(Object str) { System.out.println(str); } /** * 定义了求最大值的一个接口 */ interface JSLib { public int max(int a, int b); }
下载地址:本文已经给出了所有的源代码了。建议自己写一遍,不懂的参考API。
CSDN下载频道有源码,需要1分。(有兴趣的自己花1分,下载吧)
(上传资源,迟迟不出来,晚点再给出下载地址)
http://download.csdn.net/detail/fansunion/6821829
参考资料:http://developer.51cto.com/art/201007/208812.htm
原文链接:http://blog.fansunion.cn/articles/2839(小雷博客-blog.fansunion.cn)