首页  

java8 JavaScript引擎 Nashorn     所属分类 java 浏览量 119
Nashorn, JavaScript 引擎   在JVM上运行javascript 代码

Nashorn Java虚拟机JavaScript引擎 ,Nashorn于2014年在jdk8中首次亮相,
提高了Java和JavaScript之间的兼容性,同时提供了性能优势。 
但是随着ECMAScript语言标准的快速发展,维护Nashorn引擎变得越发挑战,因此该引擎将在Java中废弃。
Java11 声明弃用Nashorn JavaScript脚本引擎,相关API和jjs工具,并在未来的版本中移除这些特性。


import javax.script.*;


public class JsDemo {
    public static void main(String[]args)throws Exception {

        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("nashorn");

        Object result = null;

        String script = "var data = {\"name\":\"tiger\"};\n data;";
        result = engine.eval(script);
        // class jdk.nashorn.api.scripting.ScriptObjectMirror#[object Object]
        printResult(result);

        script = "var data = {\"name\":\"tiger\"};\n data.name;";
        result = engine.eval(script);
        // class java.lang.String#tiger
        printResult(result);

        Bindings binding = engine.createBindings();
        RunContext context = new RunContext();
        // js脚本中 可直接引用 context ,调用相关方法
        binding.put("context",context);
        script = "context.getId();";
        result = engine.eval(script,binding);
        // class java.lang.Long#1
        printResult(result);

        try {
            result = engine.eval(script);
            printResult(result);
        }catch(Exception e){
            // 没有 binding ,脚本里使用 context 报错
            // javax.script.ScriptException: TypeError: context.getId is not a function in  at line number 1
            System.out.println(e);
        }

        //
        script = "var util = Java.type('dyyx.util.CommUtil');util.getNowTimeStr();";
        result = engine.eval(script);
        // 使用 java中的类 ,可以调用静态方法
        // class java.lang.String#2024-01-16T13:34:43.063
        printResult(result);

        script = "var util = Java.type('dyyx.util.CommUtil');" +
                "var Date = Java.type('java.util.Date');" +
                "var now = new Date();" +
                "util.formatDate(now,'yyyy-mm-dd');";

        result = engine.eval(script);
        // class java.lang.String#2024-34-16
        printResult(result);

        CompiledScript compliedScript = null;
        // 编译后执行
        compliedScript = ((Compilable)engine).compile(script);
        // jdk.nashorn.api.scripting.NashornScriptEngine$3@4278a03f
        System.out.println(compliedScript.toString());
        // jdk.nashorn.api.scripting.NashornScriptEngine@147ed70f
        System.out.println(compliedScript.getEngine().toString());
        // class java.lang.String#2024-43-16
        result = compliedScript.eval(binding);
        printResult(result);

    }

    public static void printResult(Object result){
        if(result == null){
            System.out.println(result == null);
        }else{
            System.out.println(result.getClass()+"#"+result);
        }
    }
}


java CommUtil public static String getNowTimeStr(){ return LocalDateTime.now().toString(); } public static String formatDate(Date date, String format){ SimpleDateFormat sdf = new SimpleDateFormat(format); return sdf.format(date); }

上一篇     下一篇
vertx verticle 实例

vertx verticle 部署和卸载

项目和产品技术栈

javascript 字符串相等判断

javascript 实用代码

ehcache 例子