簡體   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