수색…


소개

Nashorn은 오라클이 자바로 개발 된 자바 스크립트 엔진 및 Java Nashorn은 JSR-223을 통해 자바 애플리케이션에서 자바 스크립트를 삽입 및 독립 자바 스크립트 애플리케이션을 개발할 수있게 8과 함께 출시되었으며, 더 나은 제공 은 ECMA와 런타임 성능과 더 나은 준수 표준화 된 자바 스크립트 사양.

통사론

  • ScriptEngineManager // ScriptEngine 클래스에 대한 검색 및 설치 메커니즘을 제공합니다. SPI (서비스 공급자 인터페이스)
  • ScriptEngineManager.ScriptEngineManager () // 권장 생성자
  • ScriptEngine // 스크립트 언어에 대한 인터페이스를 제공합니다.
  • ScriptEngine ScriptEngineManager. getEngineByName (String shortName) // 지정된 구현의 팩토리 메서드입니다.
  • Object ScriptEngine.eval (String script) // 지정된 스크립트를 실행합니다.
  • Object ScriptEngine.eval (Reader reader) // 지정된 소스로부터 스크립트를로드 해 실행합니다.
  • ScriptContext ScriptEngine.getContext () // 디폴트의 바인딩, 리더와 라이터의 프로 바이더를 돌려줍니다.
  • void ScriptContext. setWriter (Writer writer) // 스크립트 출력을 보낼 대상을 설정합니다.

비고

Nashorn은 Java로 작성되고 Java 8에 포함 된 JavaScript 엔진입니다. 필요한 모든 것이 javax.script 패키지에 번들로 제공됩니다.

ScriptEngineManager 는 다양한 스크립트 언어 (예 : JavaScript뿐 아니라 Nashorn)를위한 스크립트 엔진을 얻을 수있는 일반 API를 제공합니다.

전역 변수 설정

// Obtain an instance of JavaScript engine
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");

// Define a global variable
engine.put("textToPrint", "Data defined in Java.");

// Print the global variable
try {
    engine.eval("print(textToPrint);");
} catch (ScriptException ex) {
    ex.printStackTrace();
}

// Outcome:
// 'Data defined in Java.' printed on standard output

안녕하세요 Nashorn

// Obtain an instance of JavaScript engine
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");

// Execute an hardcoded script
try {
    engine.eval("print('Hello Nashorn!');");
} catch (ScriptException ex) {
    // This is the generic Exception subclass for the Scripting API
    ex.printStackTrace();
}

// Outcome:
// 'Hello Nashorn!' printed on standard output

JavaScript 파일 실행

// Required imports
import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
import javax.script.ScriptException;
import java.io.FileReader;
import java.io.FileNotFoundException;

// Obtain an instance of the JavaScript engine
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");

// Load and execute a script from the file 'demo.js'
try {
    engine.eval(new FileReader("demo.js"));
} catch (FileNotFoundException ex) {
    ex.printStackTrace();
} catch (ScriptException ex) {
    // This is the generic Exception subclass for the Scripting API
    ex.printStackTrace();
}

// Outcome:
// 'Script from file!' printed on standard output

demo.js :

print('Script from file!');

스크립트 출력을 가로 채기

// Obtain an instance of JavaScript engine
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");

// Setup a custom writer
StringWriter stringWriter = new StringWriter();
// Modify the engine context so that the custom writer is now the default
// output writer of the engine
engine.getContext().setWriter(stringWriter);

// Execute some script
try {
    engine.eval("print('Redirected text!');");
} catch (ScriptException ex) {
    ex.printStackTrace();
}

// Outcome:
// Nothing printed on standard output, but
// stringWriter.toString() contains 'Redirected text!'

산술 문자열 평가

// Obtain an instance of JavaScript engine
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");

//String to be evaluated
String str = "3+2*4+5";
//Value after doing Arithmetic operation with operator precedence will be 16

//Printing the value
try {
    System.out.println(engine.eval(str));
} catch (ScriptException ex) {
    ex.printStackTrace();
}

//Outcome:
//Value of the string after arithmetic evaluation is printed on standard output.
//In this case '16.0' will be printed on standard output.

Nashorn의 자바 스크립트에서 Java 객체 사용

Nashorn 엔진에 Java 객체를 전달하여 Java 코드로 처리 할 수 ​​있습니다. 동시에 일부 JavaScript (및 Nashorn) 관련 구문이 있으며 Java 객체와 함께 작동하는 방식이 항상 명확하지는 않습니다.

아래에는 자바 스크립트 구조 내에서 기본 Java 객체의 동작을 설명하는 표가 있습니다.

테스트를 거친 구조 :

  1. if 절의 표현식. if 절의 JS 표현식에서 Java와 달리 부울 값일 필요는 없습니다. 소위 falsy 값 (null, undefined, 0, 빈 문자열 등)에 대해 false로 평가됩니다.
  2. 각 문에 대해 Nashorn은 다른 JS 및 Java 객체를 반복 할 수있는 특별한 종류의 루프를 각각 가지고 있습니다.
  3. 개체 크기를 가져 오는 중입니다. JS 객체에는 배열 또는 문자열의 크기를 반환하는 속성 길이가 있습니다.

결과 :

유형 만약 각각 .길이
Java null 그릇된 반복 없음 예외
Java 빈 문자열 그릇된 반복 없음 0
자바 문자열 참된 문자열 문자를 반복합니다. 문자열의 길이
Java 정수 / Long 가치! = 0 반복 없음 정의되지 않은
Java ArrayList 참된 요소를 반복 처리합니다. 목록의 길이
Java HashMap 참된 값을 반복 처리합니다. 없는
Java HashSet 참된 항목을 반복합니다. 정의되지 않은

권장 사항 :

  • 문자열이 null이 아니고 비어 있지 않은지 확인하려면 if (some_string) 를 사용 if (some_string) 것이 좋습니다.
  • for each 은 안전하게 모든 콜렉션을 반복하는데 사용될 수 있고, 콜렉션이 반복 가능, 널 또는 정의되지 않은 경우 예외를 발생시키지 않기 때문에
  • 객체의 길이를 가져 오기 전에 null 또는 undefined를 확인해야합니다 (메소드를 호출하거나 Java 객체의 속성을 얻는 모든 시도에서 마찬가지입니다)

스크립트에서 인터페이스 구현하기

import java.io.FileReader;
import java.io.IOException;

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

public class InterfaceImplementationExample {
    public static interface Pet {
        public void eat();
    }

    public static void main(String[] args) throws IOException {
        // Obtain an instance of JavaScript engine
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("nashorn");

        try {
            //evaluate a script
            /* pet.js */
            /*
                var Pet = Java.type("InterfaceImplementationExample.Pet");
                
                new Pet() {
                    eat: function() { print("eat"); }
                }            
            */
            
            Pet pet = (Pet) engine.eval(new FileReader("pet.js"));
            
            pet.eat();
        } catch (ScriptException ex) {
            ex.printStackTrace();
        }

        // Outcome:
        // 'eat' printed on standard output
    }
}

전역 변수 설정 및 가져 오기

// Obtain an instance of JavaScript engine
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");

try {
    // Set value in the global name space of the engine
    engine.put("name","Nashorn");
    // Execute an hardcoded script
    engine.eval("var value='Hello '+name+'!';");
    // Get value
    String value=(String)engine.get("value");
    System.out.println(value);
} catch (ScriptException ex) {
    // This is the generic Exception subclass for the Scripting API
    ex.printStackTrace();
}

// Outcome:
// 'Hello Nashorn!' printed on standard output


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow