[英]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.