수색…


소개

Java 자체는 매우 강력한 언어이지만 강력한 기능을 추가로 확장 할 수 있습니다. JSR223 (Java Specification Request 223)

비고

Java Scripting API를 사용하면 외부 스크립트가 Java와 상호 작용할 수 있습니다.

Scripting API는 스크립트와 java 간의 상호 작용을 가능하게합니다. 스크립트 언어는 클래스 경로에 스크립트 엔진을 구현해야합니다.

기본적으로 JavaScript (ECMAScript라고도 함)는 기본적으로 nashorn에 의해 제공됩니다. 모든 스크립트 엔진에는 모든 변수, 함수 및 메서드가 바인딩에 저장되는 스크립트 컨텍스트가 있습니다. 출력을 버퍼링 된 Writer로 리디렉션하고 다른 유형으로 오류를 지원할 때 여러 컨텍스트를 사용할 수도 있습니다.

자이 썬과 JRuby 같은 다른 많은 스크립트 엔진 라이브러리가있다. 그들이 클래스 패스에 있다면 코드를 평가할 수 있습니다.

변수에 스크립트를 표시하기 위해 바인딩을 사용할 수 있습니다. 엔진에 변수를 노출하는 것은 기본적으로 해당 엔진에만 변수를 노출시키는 경우가 있으며, 때로는 동일한 유형의 모든 엔진에 대해 동일한 시스템 환경 및 경로와 같은 특정 변수를 노출해야하는 경우가 있으므로 여러 바인딩이 필요한 경우가 있습니다. 이 경우 전역 범위 인 바인딩이 필요합니다. 동일한 EngineFactory로 작성된 모든 스크립트 엔진에이를 표시하는 변수 노출

nashorn의 스크립트 모드에서 자바 스크립트 파일 평가하기

public class JSEngine {
    
    /*
    * Note Nashorn is only available for Java-8 onwards
    * You can use rhino from ScriptEngineManager.getEngineByName("js");
    */
    
    ScriptEngine engine;
    ScriptContext context;
    public Bindings scope;
    
    // Initialize the Engine from its factory in scripting mode
    public JSEngine(){
        engine = new NashornScriptEngineFactory().getScriptEngine("-scripting");
        // Script context is an interface so we need an implementation of it
        context = new SimpleScriptContext();
        // Create bindings to expose variables into
        scope = engine.createBindings();
    }
    
    // Clear the bindings to remove the previous variables
    public void newBatch(){
        scope.clear();
    }
    
    public void execute(String file){
        try {
            // Get a buffered reader for input
            BufferedReader br = new BufferedReader(new FileReader(file));
            // Evaluate code, with input as bufferdReader
            engine.eval(br);
        } catch (FileNotFoundException ex) {
            Logger.getLogger(JSEngine.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ScriptException ex) {
            // Script Exception is basically when there is an error in script
            Logger.getLogger(JSEngine.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void eval(String code){
        try {
            // Engine.eval basically treats any string as a line of code and evaluates it, executes it
            engine.eval(code);
        } catch (ScriptException ex) {
            // Script Exception is basically when there is an error in script
            Logger.getLogger(JSEngine.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    // Apply the bindings to the context and set the engine's default context
    public void startBatch(int SCP){
        context.setBindings(scope, SCP);
        engine.setContext(context);
    }
    
    // We use the invocable interface to access methods from the script
    // Invocable is an optional interface, please check if your engine implements it
    public Invocable invocable(){
        return (Invocable)engine;
    }
    
}

이제 주요 방법

public static void main(String[] args) {
    JSEngine jse = new JSEngine();
    // Create a new batch probably unecessary
    jse.newBatch();
    // Expose variable x into script with value of hello world
    jse.scope.put("x", "hello world");
    // Apply the bindings and start the batch
    jse.startBatch(ScriptContext.ENGINE_SCOPE);
    // Evaluate the code
    jse.eval("print(x);");
}

결과물은 다음과 유사해야합니다.
hello world

당신이 볼 수 있듯이 노출 된 변수 x가 인쇄되었습니다. 이제 파일 테스트.

여기에 test.js가 있습니다.

print(x);
function test(){
    print("hello test.js:test");
}
test();

그리고 업데이트 된 main 메소드

public static void main(String[] args) {
    JSEngine jse = new JSEngine();
    // Create a new batch probably unecessary
    jse.newBatch();
    // Expose variable x into script with value of hello world
    jse.scope.put("x", "hello world");
    // Apply the bindings and start the batch
    jse.startBatch(ScriptContext.ENGINE_SCOPE);
    // Evaluate the code
    jse.execute("./test.js");
}

test.js가 응용 프로그램과 동일한 디렉토리에 있다고 가정합니다. 다음과 유사한 출력이 있어야합니다.

hello world
hello test.js:test


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