에 사용할 수있는 속성/빈을 추가, 나는코뿔소 - 코뿔소에서 범위
/**
*
*/
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에서 어떻게 할 수 있는지.
고마워요.하지만 여전히 표기법. 을 사용하여 자바 스크립트의 속성에 액세스해야합니다. 범위에 무언가를 추가하려면 키 바인딩 된 객체에 키 이름을 넣어야합니다. Rhino에서 스크립팅 가능 영역을 실행 범위로 추가하는 경우 속성을 으로 직접 액세스 할 수 있습니다. –
NishM
AbstractJSObject.getMember()는 점 연산자를 사용하여 속성에 액세스 할 때 호출됩니다. – NishM