嵌入式Rhino和匿名js对象

Embedded Rhino and anonymous js object

本文关键字:js 对象 Rhino 嵌入式      更新时间:2023-09-26

我正在将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){...} 
});

这个特性似乎只在方法调用中声明变量时使用。