JDK8系列之JavaScript引擎Nashorn

x33g5p2x  于2022-08-17 转载在 Java  
字(2.7k)|赞(0)|评价(0)|浏览(640)

从JDK1.8开始,Java采用Nashorn作为嵌入式 JavaScript 引擎。JDK1.6和JDK1.7采用Rhino。Nashorn 支持 ECMAScript 5.1 规范,使用基于 JSR 292 的新语言特性,其中包含在 JDK 7 中引入的 invokedynamic,将 JavaScript 编译成 Java 字节码。

下面给出一些例子加深理解,一个最简单的例子,调用1+2,计算输出打印

  1. package com.example.jdkexample.core.nashorn;
  2. import javax.script.ScriptEngine;
  3. import javax.script.ScriptEngineManager;
  4. import javax.script.ScriptException;
  5. public class NashornJavaScriptExample {
  6. public static void main(String[] args) throws ScriptException {
  7. ScriptEngineManager engineManager = new ScriptEngineManager();
  8. ScriptEngine scriptEngine = engineManager.getEngineByName("JavaScript");
  9. String foo = "1+2";
  10. System.out.println(scriptEngine.eval(foo));
  11. }
  12. }

可以利用ScriptEngine对js进行执行,然后通过Hutool转为javabean

  1. private static void testJson() throws ScriptException {
  2. String script = "var json ={\"name\":\"admin\" , \"mobiTel\":\"123\"};" +
  3. "var result ={};result.name=json.name;result.mobiTel=json.mobiTel;JSON.stringify(result);";
  4. ScriptEngineManager engineManager = new ScriptEngineManager();
  5. ScriptEngine scriptEngine = engineManager.getEngineByName("JavaScript");
  6. Object obj = scriptEngine.eval(script);
  7. User user = JSONUtil.toBean(obj.toString() , User.class);
  8. System.out.println(user.toString());
  9. }

读取js文件,然后执行js脚本

  1. private static void testJsFile() {
  2. try (Reader reader= new FileReader(new File(ScriptEngineExample.class.getClassLoader().getResource("test.js").getFile()))){
  3. ScriptEngineManager engineManager = new ScriptEngineManager();
  4. ScriptEngine scriptEngine = engineManager.getEngineByName("JavaScript");
  5. scriptEngine.eval(reader);
  6. } catch (FileNotFoundException e) {
  7. log.error("FileNotFoundException:{}" , e);
  8. } catch (IOException e) {
  9. log.error("IOException:{}" , e);
  10. } catch (ScriptException e){
  11. log.error("ScriptException:{}" , e);
  12. }
  13. }

给出一串js,invokeFunction调用js里的函数

  1. private static void testInvokeFunction() throws ScriptException, NoSuchMethodException {
  2. String script = "var json ={\"name\":\"admin\" , \"mobiTel\":\"123\"};" +
  3. "function jsonStringify(){ var result ={};result.name=json.name;result.mobiTel=json.mobiTel;print(JSON.stringify(result));}";
  4. ScriptEngineManager engineManager = new ScriptEngineManager();
  5. ScriptEngine scriptEngine = engineManager.getEngineByName("JavaScript");
  6. scriptEngine.eval(script);
  7. Invocable invocable = (Invocable) scriptEngine;
  8. invocable.invokeFunction("jsonStringify");
  9. }

使用Bindings传参

  1. private static void testBinding() throws ScriptException, NoSuchMethodException {
  2. ScriptEngineManager engineManager = new ScriptEngineManager();
  3. ScriptEngine scriptEngine = engineManager.getEngineByName("JavaScript");
  4. Bindings bindings = new SimpleBindings();
  5. bindings.put("username","admin");
  6. scriptEngine.eval("print('hello , ' + username);" , bindings);
  7. }

相关文章

最新文章

更多