在Rhino中,我有一个可编写脚本的bean,如下所示
/**
*
*/
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;
}
}
我可以将这个bean作为可编写脚本的对象检索,并将其传递给编译脚本的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);
结果是马特·默多克。我们可以在这里直接引用属性,因为SomeBean实例作为作用域传递给脚本执行。
我无法在Nashorn中找到一个等效的方法。我可以使用源代码来获取CompiledScript实例,但是我不能在没有给它一个键的情况下将某个Bean添加到绑定中,并且我不能在我的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);
在Nashorn中有没有一种方法可以将NSomeOtherBean实例的属性添加到作用域中,并在不使用前缀的情况下访问它们?比如我们如何在Rhino中做到这一点。
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
http://hg.openjdk.java.net/jdk9/dev/nashorn/file/efeb16c75392/samples/BufferArray.java
http://hg.openjdk.java.net/jdk9/dev/nashorn/file/efeb16c75392/samples/jsobject_mapreduce.js
也就是说,java。util。Nashorn将地图实例视为“特殊”。i、 例如,可以像Nashorn中的对象属性一样访问地图键。
我有一个Java 7项目,它大量使用Javascript编写各种功能的脚本。到目前为止,我一直使用Rhino作为脚本引擎。我现在想转到Java 8,这也意味着我将用Nashorn取代Rhino。 Nashorn与Rhino的兼容性如何?我可以将其用作直接替换,还是我可以预期我的一些脚本将不再工作,需要移植到新引擎?Rhino是否有Nashorn不支持的常用功能?
我正在调查是否有可能将一个基于rhino的大型项目转移到纳肖恩。也就是说,该项目在一个rhino编译的脚本(10万行javascript)中运行了数千个作用域(~实例)。 我知道怎么做: 多个nashorn引擎将为我提供多个/独立的范围。工作正常,但会消耗太多内存(1000个引擎…) 我可以用Rhino做什么,想用Nashorn做什么: 在上面的示例中,我编译了一次脚本,并使用多个作用域来隔离不同
问题内容: 在当前正在研究的学习项目中,我需要添加一个属性,其值为数字。 如果我创建自己的属性,说“ messid”并为其分配一个数字值,例如“ 12”,“ 6”等,可以吗? 这就是为什么我要这样做,以便如果我做错了,则可以纠正我:我需要在我的JavaScript中(使用jQuery)访问此数字。仅获取attribute的值很容易,但是从诸如“m12”或“ m6”之类的字符串中提取数字值很麻烦。(
问题内容: 我试图使它具有包装变量的属性。 为了符合要求,我需要使用来包装属性。不幸的是,我不能将其应用于计算的属性,因为我使用了这些值。 我该如何运作?我该怎么做才能达到目的? 问题答案: 更新:使用EnclosingSelf下标,可以做到! 奇迹般有效!
我想在gradle.properties文件中添加ndk.abifilters属性。现在我有了这栋楼里的房子。这是我建筑的一部分 这是我的gradle.properties文件的一部分
为什么在这里就能看到添加的属性?