嵌入式 Rhino 和匿名 js 对象

Embedded Rhino and anonymous js object

我正在将 Rhino 脚本引擎嵌入到 Java 应用程序中。 我试图包装 Rhino Function 接口,以便在我的程序中保持独立于 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);
}

目前,Function 的包装是在基于 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){...} 
});

而且似乎只有在方法调用中声明变量时才会使用此功能。