2013-05-10 5 views
1

자바 메소드에 자바 스크립트 코드를 임베드하기 위해 javax.script를 사용하고 있습니다.javax.script to javascript 콜백으로 사용할 Java 메소드

내 프로젝트에서 javascript는 websocket을 통해 비동기 http 요청을 보내 게합니다. 응답이 수신되면 콜백 함수를 실행해야합니다.

콜백으로 Java로 작성된 메소드를 호출하고 싶습니다.

설명서의 내용은 다음과 같습니다. http://docs.oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/ 자바 스크립트에서 자바 메소드를 구현하는 방법은 설명되어 있지만 자바 메소드를 호출하는 방법은 설명하지 않습니다.

감사

답변

1

이 당신이 찾고 있지만, 여기에 나중에 그 콜백에 다시 전화 몇 가지 자바 스크립트 코드에 자바 객체 콜백을 공급하는 코드 샘플입니다 정확히 경우 확실하지 :

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

    ScriptEngineManager factory = new ScriptEngineManager(); 
    ScriptEngine engine = factory.getEngineByName("JavaScript"); 
    engine.put("cb", new JsCallback()); 
    engine.eval("println('Doing something in javascript here first');" + 
    "cb.apply('bar');"); 
    } 

    public void apply(String s){ 
    System.out.println("Back in java code here: " + s); 
    } 
} 
+0

안녕하세요 cmbaxter! 나는 잘 모르겠다. 내 프로젝트에서 나는 자바 스크립트 함수를 호출 할 것이다. 그런 다음 컨트롤은 콜백이 실행될 때까지 java로 돌아갑니다. 이것은 실제로 다른 질문을합니다. 자바 스크립트 측면에서 변수의 수명주기는 무엇입니까? 감사합니다 – Piero

+1

내가 스크립트에 제공 한 자바 변수 ('cb'에 묶여 있음)의 생명주기에 대해 묻는다면, Object ('JsCallback')는 자바에 의해 가비지 수집되지 않을 것이라고 믿을 때까지'ScriptEngine' 그 자체 ('engine')는 완전히 역 참조되어 수집 할 수 있습니다. js가 그것을 사용할 때까지 js에서 돌아 다니지 않는'cb' var에 대해 걱정한다면, 나는 당신이 될 필요가 없다고 생각합니다. 다음은 내부 동작에 대해 좀 더 자세히 알아볼 수있는 좋은 링크입니다. http://stackoverflow.com/questions/6936223/what-is-the-lifecycle-and-concurrency-semantics-of-rhino-script-engine – cmbaxter

1

사용 자바 (8)의 Function :

JS :

run = function(callback) { 
    callback("foo"); 
} 

자바 :

Function<String,String> fn = (arg) -> { 
    return arg.toUpperCase(); 
}; 

// call run(fn) 
invokeFunction("run", fn) 

또한 Runnable를 사용 (인수 또는 값 반환) 콜백 인터페이스로 아마 많은 다른 하나의 방식의 인터페이스를 할 수 있습니다. 필자가 강조한 것으로부터 인수리스트를 동적으로 일치시키는 메소드를 찾으려고 노력할 것이다.

아마도이 기능을 사용하여 함수를 범위에 바인딩 할 수도 있습니다.