[英]Dynamically declaring functions in Rhino JS context
我目前正在尝试在我的 Rhino JavaScript 上下文中动态声明函数。 我已经到了可以动态声明变量/属性的地步,但无法弄清楚如何将函数作为属性值传递。 这是我已经走了多远:
import java.lang.reflect.Member;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.FunctionObject;
import org.mozilla.javascript.Scriptable;
import org.mozilla.javascript.ScriptableObject;
public class Main {
public static void main(String[] args) {
Context jsContext = Context.enter();
try {
Scriptable scope = jsContext.initStandardObjects();
ScriptableObject fooObject = new ScriptableObject() {
@Override
public String getClassName() {
return "MyFoo";
}
};
scope.put("foo", scope, fooObject);
fooObject.putProperty(fooObject, "oneProperty", "This is the value of oneProperty");
Member myFunction = /* What goes here? */ null;
fooObject.putProperty(fooObject, "doStuff", new FunctionObject("doStuff", myFunction, fooObject));
Object resultProp = jsContext.evaluateString(scope, "foo.oneProperty", "<cmd>", 1, null);
Object resultFunc = jsContext.evaluateString(scope, "foo.doStuff()", "<cmd>", 2, null);
System.out.println("Property value: " + Context.toString(resultProp));
System.out.println("Function value: " + Context.toString(resultFunc));
}
finally {
jsContext.exit();
}
}
}
我想我在全局范围内正确定义了“foo”对象并在其上设置了属性oneProperty
,但我不知道如何为该 set 方法提供一个函数。 我这样做正确吗? 我怎样才能为一个函数做到这一点?
UPDATE看起来可以创建一个实现Function
接口的新类,实现“调用”方法,并忽略该接口所需的其他方法(只返回 null)。 然后可以将其提供给putProperty
调用。 这似乎有效,但是在代码中看到它很痛苦,并且通过阅读它并不清楚它的作用。 我仍在寻找更好的解决方案,如果存在的话。
您可以定义一个带有一些要绑定到 js 的函数的 java 类。 然后使用class.getMethod
获取Method对象创建一个FunctionObject
,最后放到js作用域。
这是 Kotlin 语言的演示:
class Container{
companion object{
@JvmStatic
fun foo() = true
}
}
val ctx: Context = Context.enter()
val scope = ctx.initStandardObjects()
val fMethod = Container::class.java.getMethod("foo")
val f = FunctionObject("foo", fMethod, scope)
scope.put("foo", scope, f)
ctx.evaluateString(scope, "foo()", "<cmd>", 1, null) // the result should be true
但是,非静态函数会复杂得多,你可以看到这个答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.