我正在研究一個使javax.script。*包的使用量非常大的項目。我有一種情況,我想要創建擴展抽象Java類的JavaScript對象,就像可以使用Invocable.getInterface來創建實現Java接口的JavaScript對象一樣。這可能嗎?如果是這樣,你怎麼做?你能從JavaScript擴展抽象Java類嗎?
回答
除非你想要去運行時產生字節碼的路線(使用BCEL如下),否則不會。你可以通過使用proxy classes的接口來完成,但是沒有抽象類的等價物。
如果你真的想嘗試BCEL,最好的策略是要做到這一點:
- 編寫使用BCEL生成字節碼的
byte[]
用於擴展抽象類和代表每一個新的類中的方法JavaScript的抽象方法。 - 定義一個將抽象類與包裝相關聯的命名約定,例如
foo.MyAbstractClass
對應於foo.MyAbstractClassDynamicLangWrapper
。 - 滾
ClassLoader
實現findClass認識到,命名規則,生成類的字節,並呼籲defineClass - 確保你的腳本語言使用您的自定義類加載解決腳本類名稱。我想在犀牛你使用setApplicationClassLoader,但我不知道。
是的,你可以;以前的海報錯了。請參閱documentation for JavaAdapter。
不幸的是,我在javax.script命名空間中使用了內置的東西,它沒有公開所有底層的Rhino對象。我的問題對這種情況非常具體,但這仍然是一個有用的答案。 –
實際上,這是暴露在JavaScript方面,應該仍然與javax.script –
一起使用重要說明:JavaAdapter的「文檔」是一個笑話 - 鏈接頁面上有一段文字,並且網絡上的一些網站已經生成JavaDoc根本沒有評論。 :( 此外,正如邁克爾指出的,你*可以*做到這一點 - 在你的Javascript代碼中,你必須傳遞'新的JavaAdapter(MyJavaClass,{myOverloadedFunc:function(a,b){return a + b; }),你可以使用'Context.jsToJava'(它實際上*有* docs)投射到'MyJavaClass'。 – Coderer
- 1. Java的抽象類擴展兩個類
- 2. 用Java中的抽象類擴展ArrayList?
- 3. Java列表擴展抽象
- 4. Java抽象/擴展問題
- 5. 擴展抽象泛型類
- 6. 抽象基類擴展
- 7. 抽象類擴展Thread
- 8. 你能擴展self.included嗎?
- 9. 瞭解Java代碼(抽象類,擴展功能)
- 10. 當抽象類擴展具體類時,繼承的成員是抽象的嗎?
- 11. 抽象類擴展的具體類
- 12. C# - 抽象類擴展類和new()?
- 13. 一個對象可以在scala中擴展抽象類嗎?
- 14. 抽象類在PHP中擴展抽象類?
- 15. 擴展另一個抽象類的php抽象類
- 16. 我們應該擴展抽象類的JavaDoc類嗎?
- 17. Java擴展/抽象/實現問題
- 18. Java是抽象類嗎?
- 19. 按鈕點擊擴展抽象類操作的Java類
- 20. 抽象類擴展了多種類型的活動Java和Android
- 21. 你可以在Java中擴展ArrayList嗎?
- 22. 在Typescript中擴展抽象類
- 23. 擴展類時出現抽象錯誤
- 24. Scala擴展參數化抽象類
- 25. 將接口擴展到抽象類
- 26. 擴展模板抽象類時出錯
- 27. 用於擴展一個抽象類
- 28. 如何用泛型擴展抽象類?
- 29. Mozilla犀牛1_7R4擴展抽象類(JS)
- 30. 在c中擴展抽象類#
這聽起來很討厭。如果是這樣的話,我想我會想出另一個解決方案。 –