2016-06-16 1 views
0

에 사용할 수있는 속성/빈을 추가, 나는코뿔소 - 코뿔소에서 범위

/** 
* 
*/ 
package test.rhino; 

import java.util.Collection; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.Set; 

import org.mozilla.javascript.FunctionObject; 
import org.mozilla.javascript.Scriptable; 

/** 
* @author 
* 
*/ 
public class SomeBean implements Scriptable, Map<String,Object> { 

    /** 
    * The current values for this object. 
    */ 
    private HashMap<String, Object> values = new HashMap<>(); 

    /** 
    * 
    */ 
    public SomeBean() { 
     System.out.println("SomeBean();"); 
    } 

    /* 
    * @see org.mozilla.javascript.Scriptable#getClassName() 
    */ 
    @Override 
    public String getClassName() { 
     return "SomeBean"; 
    } 

    /* 
    * @see org.mozilla.javascript.Scriptable#get(java.lang.String, 
    * org.mozilla.javascript.Scriptable) 
    */ 
    @Override 
    public Object get(String name, Scriptable start) { 

     System.out.println("Get is called."); 
     System.out.println("Called for this" + name + " and returned :" + values.get(name)); 

     return values.get(name); 
    } 

    /* 
    * @see org.mozilla.javascript.Scriptable#put(java.lang.String, 
    * org.mozilla.javascript.Scriptable, java.lang.Object) 
    */ 
    @Override 
    public void put(String name, Scriptable start, Object value) { 
     System.out.println("Put is called. Input name: " + name + "\n Input values: " + value); 

     values.put(name, value); 

    } 

    @Override 
    public Object get(int index, Scriptable start) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public boolean has(String name, Scriptable start) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public boolean has(int index, Scriptable start) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public void put(int index, Scriptable start, Object value) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void delete(String name) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void delete(int index) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public Scriptable getPrototype() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public void setPrototype(Scriptable prototype) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public Scriptable getParentScope() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public void setParentScope(Scriptable parent) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public Object[] getIds() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public Object getDefaultValue(Class<?> hint) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public boolean hasInstance(Scriptable instance) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public int size() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public boolean isEmpty() { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public boolean containsKey(Object key) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public boolean containsValue(Object value) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public Object get(Object key) { 
     System.out.println("MAP -- Get is called."); 
     // TODO Auto-generated method stub 
     return values.get(key); 
    } 

    @Override 
    public Object put(String key, Object value) { 
     values.put(key, value); 
     System.out.println("MAP -- Put is called."); 
     // TODO Auto-generated method stub 
     return value; 
    } 

    @Override 
    public Object remove(Object key) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public void putAll(Map<? extends String, ? extends Object> m) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void clear() { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public Set<String> keySet() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public Collection<Object> values() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public Set<java.util.Map.Entry<String, Object>> entrySet() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    private static Scriptable globalPrototype; 

    public static void finishInit(Scriptable scope, FunctionObject constructor, Scriptable prototype) { 
     System.out.println("finishInit is called."); 
     globalPrototype = prototype; 
    } 

} 

내가 스크립트 가능한 개체로이 빈을 검색하고의 eval() 함수에 전달할 수 아래와 같은 스크립트 가능한 콩이 아래처럼 컴파일 된 스크립트.

String src5 = "(function(){return Name;})();\n"; 
Script sc = getCompiledScript(src5); 
SomeBean sb = new SomeBean(); 
sb.put("Name", "Matt Murdock"); 
Scriptable sp = (Scriptable) sb; 
result = script.exec(context, sp); 

결과 인쇄물 Matt Murdock. SomeBean 인스턴스는 스크립트 실행 범위로 전달되기 때문에 여기에서 직접 속성을 참조 할 수 있습니다.

Nashorn에서 동일한 방법을 찾을 수 없습니다. 소스를 사용하여 CompiledScript 인스턴스를 얻을 수 있지만 키를주지 않고 바인딩에 SomeBean을 추가 할 수없고 JavaScript 함수에서 멤버 (Name)를 직접 호출 할 수 없습니다. 아래 코드는 접두어 키가없는 속성에 액세스 할 수 없으므로 명백한 오류를 발생시킵니다.

NSomeOtherBean nsob = new NSomeOtherBean(); // extends AbstractJSObject 
nsob.setMember("Name", "Bruce Wayne"); 

Bindings binding = engine.createBindings(); 
binding.put("nsob", nsob); 
engine.setBindings(binding, ScriptContext.GLOBAL_SCOPE); 
result = engine.eval("(function(){return Name;})();\n",binding); 

범위에 NSomeOtherBean 인스턴스의 속성을 추가하고 접두사를 사용하지 않고 그들에 액세스 할 수 Nashorn있는 방법이 있나요? 우리가 Rhino에서 어떻게 할 수 있는지.

답변

2
코뿔소 스크립트 작성의

Nashorn 상당 jdk.nashorn.api.scripting.JSObject

참조의 javadoc입니다 :

https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/jdk/nashorn/api/scripting/JSObject.html

https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/jdk/nashorn/api/scripting/AbstractJSObject.html

예 :

http://hg.openjdk.java.net/jdk9/dev/nashorn/file/efeb16c75392/samples/jsobj_example.js

,536 말했다

http://hg.openjdk.java.net/jdk9/dev/nashorn/file/efeb16c75392/samples/jsobject_mapreduce.js

http://hg.openjdk.java.net/jdk9/dev/nashorn/file/efeb16c75392/samples/BufferArray.java

91,363,210는 java.util.Map 인스턴스는 Nashorn에 의한 "특별한"로 처리됩니다. 즉 Map 키는 Nashorn의 객체 속성과 마찬가지로 액세스 할 수 있습니다.

+0

고마워요.하지만 여전히 표기법 . 을 사용하여 자바 스크립트의 속성에 액세스해야합니다. 범위에 무언가를 추가하려면 키 바인딩 된 객체에 키 이름을 넣어야합니다. Rhino에서 스크립팅 가능 영역을 실행 범위로 추가하는 경우 속성을 으로 직접 액세스 할 수 있습니다. – NishM

+0

AbstractJSObject.getMember()는 점 연산자를 사용하여 속성에 액세스 할 때 호출됩니다. – NishM