2011-08-28 4 views
0

ScriptEngineManager 내부에서 Java 메소드에 액세스 할 수 있습니까?Java ScriptEngineManager가 특정 Java 메소드에 액세스하도록 허용

Invocable invoke 함수 메서드를 사용하는 방법을 알았지 만 이제는 그 반대가 필요합니다.

public class Main { 
  public static void main (String[] args) throws Exception { 
    String source = "var results = system.foo('example');            \n" + 
        "                                                \n" + 
        "if(results == \"hello\") {                      \n" + 
        "  print(\"ding dong.\");                        \n" + 
        "}                                               \n"; 
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript"); 
    engine.eval(source); 
    } 
} 

public class System { 
  public static String foo (String x) throws Exception { 
    // do something with x 
    return("hello"); 
    } 
} 

그래서 내가 실행할 때 System.foo의 방법을 실행해야합니다 system.foo.

+0

JavaScript 엔진을 찾고 있다면 최신 버전의 Rhino를 사용하게 될 것입니다. JRE와 함께 패키지 된 버전은 오래되었습니다. – babsher

+0

나는 그들이 접근 할 수있는 클래스를 지정할 수 있어야한다. – Mark

답변

0

Mozilla Rhino을 사용하면 훨씬 쉽습니다. 당신의 스크립트에 System.out를 노출하고 싶어 말 :

다음
Context cx = Context.enter(); 
Scriptable scope = cx.initStandardObjects(); 
Object wrappedOut = Context.javaToJS(System.out, scope); 
ScriptableObject.putProperty(scope, "out", wrappedOut); 

자바 스크립트 :

var hello = "Hello World"; 
out.println(hello); 

또한 Rhino의 라이브러리에 기능 클래스를 확장하여 개별 Java 메소드를 노출 할 수 있습니다 그들이에 노출하여 스크립트를 비슷한 방식으로 사용합니다.

+0

이렇게 모든 방법이 노출되는 것은 아닙니다. – Mark

+0

개체를 노출하거나 Rhino 라이브러리에 Function 개체를 구현하여 메서드를 래핑 할 수 있습니다. – babsher

관련 문제