嵌入式Rhino和匿名js对象
Embedded Rhino and anonymous js object
我正在将Rhino脚本引擎嵌入Java应用程序中。我试图包装RhinoFunction接口,以便在程序中独立于ScriptEngine。
如下面的示例中所述,在显式声明的情况下,发送的对象会被正确包装,但在匿名对象的情况下会发送com.sun.proxy.$proxy。
// 1 - Explicit declaration of the callback
// Recognise the type of 'event'
// The object passed to setCallback is a custom Function wrapper.
var obj = function(event) {
print(event.value());
};
javaObj.setCallback(obj);
// 2 - Anonymous callback declaration
// Convert 'event' to a dummy Object (=> event.value() not found)
// The object passed to setCallback is of class com.sun.proxy.$Proxy.
javaObj.setCallback(function(event) {
print(event.value());
});
回调方法定义如下:
public class JavaObj {
public void setCallback(final ScriptFunction callback) {
callback.call(event);
}
}
public interface ScriptFunction {
Object call(Object... args);
}
目前,函数的包装是在基于sun:ExternalScriptable实现的自定义范围内完成的,但可能有更好的方法?
我的问题是,在匿名对象声明的情况下,我找不到从javascript到Java的转换是在哪里完成的。
对于那些可能来这里寻找答案的人:
Proxy是Rhino的一个特性,它试图从给定的json对象中识别接口。例如:
// Java
public interface ScriptFunction {
Object method(Object arg1);
}
public class JavaObj {
public void setCallback(final ScriptFunction callback) {
callback.method("this will work");
}
}
// JavaScript
javaObj.setCallback({
'method': function(oneArg){...}
});
这个特性似乎只在方法调用中声明变量时使用。
相关文章:
- 查看JS对象的所有键,甚至是getter定义的键
- 在URL中传递JS对象
- 当属性不一致时,如何根据属性对JS对象列表进行排序
- JS对象密钥序列
- 在ajax调用中阻止来自JS对象的函数
- 属性未添加到JS对象
- 将字符串转换为JS对象
- 使用lodash查找具有truthy值的JS对象的属性
- 将toString方法暴露给nashorn中的js对象
- JSON数组转换为JS对象数组
- 将js对象更改为使用嵌套的可观察数组敲除js视图模型
- 设置1400个Raphael.js对象的不透明度动画会影响动画性能
- 以非ajax方式将js对象传递给mvc操作
- JS对象->来自jquery ajax的JSON提交->php迭代
- XMLHttpRequest发送JS对象
- 使用游标循环将JS对象添加到数组中
- 动态(重新)创建iframe内容不会重置Chrome中的JS对象
- 将JS对象数组转换为嵌套形式的最有效方法
- 在知道对象值的情况下,确定数组中JS对象的索引
- JS对象文字中的方法和子方法