繁体   English   中英

我可以在Oracle JDK7 JSR223 JavaScript引擎中扩展Java类吗?

[英]Can I extend a Java class in Oracle's JDK7 JSR223 JavaScript engine?

我正在尝试编写JavaScript,该JavaScript将定义一个扩展现有Java类的类,该类从JSR223 ScriptEngine调用。 我知道JavaAdapter适用于接口,但不适用于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绑定,但是我更希望将其保持尽可能抽象。

它会抛出什么?

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);

我想我已经知道了。 我的印象是我只能实现一个接口,但是事实证明,您还可以扩展一个具体的类-只有抽象类才会抛出我所描述的错误。

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

这足够满足我的需求-但是文档绝对可以更清晰!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM