2011-06-27 19 views
4

我正在研究一個使javax.script。*包的使用量非常大的項目。我有一種情況,我想要創建擴展抽象Java類的JavaScript對象,就像可以使用Invocable.getInterface來創建實現Java接口的JavaScript對象一樣。這可能嗎?如果是這樣,你怎麼做?你能從JavaScript擴展抽象Java類嗎?

回答

0

除非你想要去運行時產生字節碼的路線(使用BCEL如下),否則不會。你可以通過使用proxy classes的接口來完成,但是沒有抽象類的等價物。

如果你真的想嘗試BCEL,最好的策略是要做到這一點:

  1. 編寫使用BCEL生成字節碼的byte[]用於擴展抽象類和代表每一個新的類中的方法JavaScript的抽象方法。
  2. 定義一個將抽象類與包裝相關聯的命名約定,例如foo.MyAbstractClass對應於foo.MyAbstractClassDynamicLangWrapper
  3. ClassLoader實現findClass認識到,命名規則,生成類的字節,並呼籲defineClass
  4. 確保你的腳本語言使用您的自定義類加載解決腳本類名稱。我想在犀牛你使用setApplicationClassLoader,但我不知道。
+0

這聽起來很討厭。如果是這樣的話,我想我會想出另一個解決方案。 –

2

是的,你可以;以前的海報錯了。請參閱documentation for JavaAdapter

+0

不幸的是,我在javax.script命名空間中使用了內置的東西,它沒有公開所有底層的Rhino對象。我的問題對這種情況非常具體,但這仍然是一個有用的答案。 –

+0

實際上,這是暴露在JavaScript方面,應該仍然與javax.script –

+0

一起使用重要說明:JavaAdapter的「文檔」是一個笑話 - 鏈接頁面上有一段文字,並且網絡上的一些網站已經生成JavaDoc根本沒有評論。 :( 此外,正如邁克爾指出的,你*可以*做到這一點 - 在你的Javascript代碼中,你必須傳遞'新的JavaAdapter(MyJavaClass,{myOverloadedFunc:function(a,b){return a + b; }),你可以使用'Context.jsToJava'(它實際上*有* docs)投射到'MyJavaClass'。 – Coderer