1

我正在尝试编写 JavaScript,它将定义一个扩展现有 Java 类的类,从 JSR223 调用ScriptEngine。我知道JavaAdapter 适用于 Interface,但不适用于 Class

ScriptEngine js = new ScriptEngineManager().getEngineByExtension("js");
js.eval("new java.lang.Runnable {run: function() { ... } }"); // works
js.eval("new java.util.TimerTask {run: function() { ... } }"); // throws

我知道这是我应该期待的文档。我也知道,一旦我可以切换到 Nashorn,这一切都会消失,我将可以很好地访问Java.extend()等,但目前我还坚持使用 JDK7。

鉴于这一切,有没有办法做到这一点?我认为我的后备方案将直接切换到 Mozilla 的原生 Rhino 绑定,但我更愿意尽可能保持抽象。

4

2 回答 2

0

它抛出什么?

jjs> var tt = new java.util.TimerTask {run: function() { print("hello"); }}
jjs> tt.run();
hello
null

我通常完全跳过 TimerTask

// Daemon flag seems to be ignored.
var timer = new java.util.Timer(false);
timer.schedule(function() print("Hello"), 1000);

// Give timer a chance to run before exit.
java.lang.Thread.sleep(5000);
于 2014-03-20T12:08:15.417 回答
0

我想我已经想通了。我的印象是我只能实现一个接口,但事实证明你也可以扩展一个具体的类——只有抽象类会抛出我描述的错误。

ScriptEngine js = new ScriptEngineManager().getEngineByExtension("js");
js.eval("new java.lang.Runnable() {run: function() { ... } }"); // works
js.eval("new java.lang.Thread() {run: function() { ... } }"); // works
js.eval("new java.util.TimerTask() {run: function() { ... } }"); // throws

这足以满足我的需求——不过,文档肯定会更清晰!

于 2014-03-20T14:42:04.353 回答