嵌入式 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){...}
});
而且似乎只有在方法调用中声明变量时才会使用此功能。
我正在将 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){...}
});
而且似乎只有在方法调用中声明变量时才会使用此功能。