2013-10-07 93 views
5

因此對於這個項目,我試圖在運行時擴展一個類。 我想知道的是,這甚至有可能嗎?如果是這樣,我該怎麼做?這些東西有圖書館嗎?在運行時擴展類

+0

你爲什麼要這麼做?請澄清用例。我懷疑這是否可能。 –

回答

4

CGLib是你要找的圖書館。在擴展類或在運行時實現接口方面是相當強大的,所以許多流行的框架(如Spring或Hibernate)都使用它。

您可以創建類擴展的代碼一樣

public Object createProxy(Class targetClass) { 
    Enhancer enhancer = new Enhancer(); 
    enhancer.setSuperclass(targetClass); 
    enhancer.setCallback(NoOp.INSTANCE); 
    return enhancer.create(); 
    } 

雖然你可能會與期望的邏輯的有效方法攔截器更換NoOp回調。

+0

太棒了,謝謝! – PaulBGD

1

是的,可以在運行時擴展一個類。嘗試一個能夠在運行時修改字節碼的庫,例如javassistASM

0

答案取決於「擴展課程」的含義。在java中,「擴展」意味着聲明另一個擴展第一個類的類(是一個子類)。所以如果你想創建一個給定類的子類,這是可能的 - 只需準備一個表示子類的字節數組並將其傳遞給類加載器即可。

如果要將字段或方法添加到現有類中,則只有在加載此類時纔有可能,並且可以通過替換字節數組表示來完成。如果class已經加載,你不能以任何方式修改它。

+0

我只是想動態地選擇擴展哪個類(因爲類的類路徑不斷變化)。 – PaulBGD