我想知道在某種程度上取代Java的「擴展」的關鍵字爲動態擴展基於參數(文件,環境變量,DB ...基本上任何東西)的類。這甚至是可能的,因爲玩類加載器或調用構造函數不會實現這一點。我不是問「我應該用接口或超類層次」,而什麼是真正延伸JAVA引擎蓋下的意思,因爲沒有任何關於它的很好的說明只是美好的舊的繼承行話:的Java編程擴展
https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
我想知道在某種程度上取代Java的「擴展」的關鍵字爲動態擴展基於參數(文件,環境變量,DB ...基本上任何東西)的類。這甚至是可能的,因爲玩類加載器或調用構造函數不會實現這一點。我不是問「我應該用接口或超類層次」,而什麼是真正延伸JAVA引擎蓋下的意思,因爲沒有任何關於它的很好的說明只是美好的舊的繼承行話:的Java編程擴展
https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
爲「取代extends
關鍵字」的唯一方法是在運行時,這是完全可能的,但不平凡的動態創建的類。 Vert.x是廣泛使用動態生成類的項目的一個很好的例子。
在這個意義上,Java沒有被設計成一種動態語言。有幾種動態語言(其中一些可以在JVM上運行),比如JavaScript。
,而什麼是真正延長髮動機罩下的意思是......
沒有進入對OOP很長的論文,當你說Derived extends Base
,這意味着Derived
繼承了公衆和保護的API Base
(它可以添加到)以及該API的實現。這意味着,代碼期待看到一個Base
實例可以接受Derived
實例,因爲Derived
「是」 Base
。該鏈接是在編譯時創建的。在運行時,實例化Derived
的實例涉及實例化Base
實例所涉及的所有管道,然後再添加Derived
的管道。
感謝您的答案,我將研究這個Vert.x項目。 – Zoltan
你不能用像Java這樣的語言來做到這一點。關於「繼承」的信息不僅被編譯器使用,還被編譯成字節碼。
如果你真的想要這樣的「動態」元編程;你最好使用允許你這樣做的語言;而不是「違反」一種從未用於這種用法的語言。
要使用一些比較笨的:只是因爲你碰巧知道「螺絲釘」和「錘子」 ......你會不會開始使用錘子讓這些螺絲釘到牆上,你會嗎?相反,你會尋找一種比「錘子」更適合「螺絲」的工具。
如果您仍希望代碼在JVM中運行,你可能會考慮像jython或jruby這樣的語言。
要做到這一點,你需要保持基於條件一類的各種版本,你必須在一個點自定義類加載器以及因爲當你發現你需要加載特定情況下,你需要加載在JVM啓動時未由缺省類加載器加載的類。
其更好地維護之類的多個版本,並讓JVM做的工作,它完全一樣。
你會在這個參數的基礎上做什麼?爲什麼不能爲不同的參數提供一個類的多個實例? (簡短的回答是:不,你不能。繼承是編譯時烘焙到類中的屬性) –
爲什麼你想要這樣做?這是否像一個動態代理? – Thilo
@AndyTurner可能會註釋和反映? –