我一直在关注Rhino documentation和source code,了解如何实现我自己的全局本机函数。然而,这项任务比我预期的要复杂得多。
在阅读了RingoJS中require
函数实现的code后,我相信我需要按照以下几点做一些事情:
import org.mozilla.javascript.BaseFunction;
import org.mozilla.javascript.Scriptable;
import org.mozilla.javascript.Context;
public class MyGlobalNativeFunction extends BaseFunction {
public MyGlobalNativeFunction() {}
public Object call(Context cx, Scriptable scope, Scriptable thisObj, Object[] args) {
// implementation of my function
}
public int getArity() {
return 1;
}
}
我是否在正确的轨道上?关于如何实现这一目标的一步一步演练将是非常好的。
如果我可以使用Rhino的defineClass
函数来创建我的全局本机函数,那也很棒。我不太热衷于推出我自己的Rhino修改版本,因为我想实现一个原生函数。
答案 0 :(得分:4)
我认为这应该有效,如果你只想实现一个单一的全局函数,这是一个很好的方法。如果要实现多个函数或主机对象,还有其他方法。
然后你可以使用这样的东西来实例化你的函数:
scope.defineProperty("myNativeFunction",
new MyGlobalNativeFunction(),
ScriptableObject.DONTENUM);
查看RingoGlobal如何完成此操作(它还显示了如何在一次扫描中定义多个函数,而无需为每个函数创建一个类)。 Rhino examples directory包含一些如何使用Rhino创建正确的宿主对象的示例。
答案 1 :(得分:4)
首先,您需要初始化全局范围(初始化所有javascript标准对象,函数等),然后将您的函数添加到此范围,如HannesWallnöfer所写。
Context cx = Context.enter(); //enter rhino context - bind context with current thread
Scriptable globalScope= cx.initStandardObjects(); //init js standard object in global scope
globalScope.defineProperty("myNativeFunction",
new MyGlobalNativeFunction(),
ScriptableObject.DONTENUM);
就是这样。
现在调用此函数调用:
Object result = cx.evaluateString(globalScope, "myNativeFunction()", "<cmd>", 1, null);
有关详细信息,请参阅:rhino embedding tutorial