Giới thiệu về Nashorn Javascript Engine trong java 8

Giới thiệu Nashorn Javascript Engine trong Java 8

  1. Giới thiệu:

    Oracle ra mắt phiên bản Java 8 trong năm 2014, có rất nhiều đổi mới trong phiên bản. Đối với những ai yêu thích Javascript thì chắc chắn không thể không quan tâm đến engine mới Nashorn thay thế cho engine Rhino. Đã được tích hợp trong JVM để dụng cho lập trình giao tiếp giữa Java <-> Javascript trở nên dễ dàng và có hiệu năng cao hơn

  2. Nashorn là gì?

    Nashorn là một "Javascript engine" được phát triển trong ngôn ngữ java. Nó được phát triển dựa vào "Da Vinci Machine(JSR 292)" và được tích hợp trong java 8 Việc thực thi Javasciprt trên JVM thông qua "invokeDynamic" đã được giới thiệu trong java 7

  3. Tại sao Nashorn lại được phát triển?

    • Nó được phát triển để thay thế cho javascript engine đã cũ trong JVM từ năm 1997

    • Tạo ra cầu nối giữa Javascript <-> Java

    • Nâng cao hiệu năng của việc thực thi javascript trong Java

    • Bằng việc tích hợp Javascript trong java, bạn có thể chỉnh sửa, mở rộng, sử dụng các ưu điểm của các API có sẵn trong Java

  4. Nashorn engine

    Là một Javascript engine viết dựa trên tài liệu mô tả của ECMAScript engine được tích hợp trong JDK, nó được phát triển đầy đủ bởi Oracle và được tích hợp trong JDK8 tương thích hoàn toàn với Javascript

  5. Làm thế nào để sử dụng Nashorn?

    • Cần import thư viện javax.script.* để sử dụng engine trong java

    • Khởi tạo một đối tượng Nashorn Script Engine sử dụng ScriptEngineManager của Java

    • Sử dụng script engine vừa tạo để thực hiện một đoạn Javascript

    Ví dụ:

    import javax.script.ScriptEngine;
    import javax.script.ScriptEngineManager;
    import javax.script.ScriptException;

    public class Nashorn {
        public static void main(String[] args) throws ScriptException {
            ScriptEngine engine = new ScriptEngineManager().getEngineByName("js");
            engine.eval("print('Helloworld')");
        }
    }
  1. Hiệu năng mới trong Nashorn Engine:

    Source code kiểm thử:

    import javax.script.ScriptEngine;
    import javax.script.ScriptEngineManager;
    import javax.script.ScriptException;

    public class Nashorn {
        public static void main(String[] args) throws ScriptException {
            ScriptEngine engine = new ScriptEngineManager().getEngineByName("js");
            System.out.println(engine.toString());
            long startTime = System.currentTimeMillis();
            engine.eval("var count = 0;for(var i=0;i<100000;i++){count += i}");
            System.out.println("finish " + (System.currentTimeMillis() - startTime));
        }
    }
Chạy với Java8:
	[email protected]
	finish 117
Chạy với Java7:
	[email protected]
	finish 294
  1. Các cách sử dụng các thư viện có sẵn của Java bằng script engine

    7.1. Sử dụng class của Java

    import javax.script.ScriptEngine;
    import javax.script.ScriptEngineManager;

    public class EvalFile {
        public static void main(String[] args) throws Exception {
            ScriptEngine engine = new ScriptEngineManager().getEngineByExtension("js");

            // evaluate JavaScript code
            engine.eval(new java.io.FileReader("script.js"));
        }
    }
7.2. Đưa một object của Java thành một biến global của script engine:
    import javax.script.ScriptEngine;
    import javax.script.ScriptEngineManager;
    import java.io.*;

    public class ScriptVars {
        public static void main(String[] args) throws Exception {
            ScriptEngine engine = new ScriptEngineManager().getEngineByExtension("js");

            // create File object
            File f = new File("test.txt");
            // expose File object as a global variable to the engine
            engine.put("file", f);
            // evaluate JavaScript code and access the variable
            engine.eval("print(file.getAbsolutePath())");
        }
    }

7.3. Thực thi một Script function từ script engine.
    import javax.script.ScriptEngine;
    import javax.script.ScriptEngineManager;

    public class InvokeScriptFunction {
        public static void main(String[] args) throws Exception {
            ScriptEngine engine = new ScriptEngineManager().getEngineByExtension("js");

            // evaluate JavaScript code that defines a function with one parameter
            engine.eval("function hello(name) { print('Hello, ' + name) }");

            // create an Invocable object by casting the script engine object
            Invocable inv = (Invocable) engine;

            // invoke the function named "hello" with "Scripting!" as the argument
            inv.invokeFunction("hello", "Scripting!");
        }
    }
7.4. Thực thi một script method của object
    import javax.script.ScriptEngine;
    import javax.script.ScriptEngineManager;
    public class InvokeScriptMethod {
        public static void main(String[] args) throws Exception {
            ScriptEngine engine = new ScriptEngineManager().getEngineByExtension("js");

            // evaluate JavaScript code that defines an object with one method
            engine.eval("var obj = new Object()");
            engine.eval("obj.hello = function(name) { print('Hello, ' + name) }");

            // expose object defined in the script to the Java application
            Object obj = engine.get("obj");

            // create an Invocable object by casting the script engine object
            Invocable inv = (Invocable) engine;

            // invoke the method named "hello" on the object defined in the script
            // with "Script Method!" as the argument
            inv.invokeMethod(obj, "hello", "Script Method!");
        }
    }

Trên là giới thiệu cơ bản về Nashorn Javascript Engine trong java 8, hy vọng các bạn cảm thấy thú vị với Nashorn Javascript Engine.

Thông tin chi tiết về Nashorn các bạn có thể đọc ở đây