2013-02-25 19 views
6

是否有可能使用字節碼操作來繼承最終的類?是否有可能以某種方式繼承修改字節碼的最終類?

+1

不會「組成而不是繼承」解決您的問題?你可以使用包裝類來處理你想要做的事情嗎?請張貼一些細節,如果有這麼少量的信息是很難提供的...(和vikingsteve是對的!) – ppeterka 2013-02-25 12:24:05

+5

'final'通常是有原因的... – vikingsteve 2013-02-25 12:24:33

+0

你試圖繼承?標準庫之一? – 2013-02-25 13:21:17

回答

4

是和否。

您可以使用字節碼操作將final類更改爲非final。這甚至不會破壞二進制兼容性,所以不存在類加載器/驗證器錯誤的風險。

但是,您必須將字節碼修改應用於final類本身。您無法對子類進行字節碼操作,以使其從父類繼承。或者更確切地說,如果你這樣做,修改後的子類將被父類與final一起加載時拒絕。

+0

如果您需要特定參考 - JVMS第4.1節,第70頁 - 「其超類的任何一個或其任何超級類別都不能在其ClassFile結構的access_flags項目 中設置ACC_FINAL標誌。 – Antimony 2013-02-25 13:58:15

+0

JLS也提到了這個問題 - http://docs.oracle.com/javase/specs/jls/se7/html/jls-13.html#jls-13.4.2 – 2013-02-25 14:46:42

+0

但是這個問題是關於字節碼操作的,在這種情況下JLS是無關緊要的。 Java語言有大量的字節碼級不存在的任意限制。 – Antimony 2013-02-25 14:53:49

0

This描述了類文件格式。在偏移量10+cpsize有2個字節定義了這個類的訪問標誌。其中一個標誌叫做ACC_FINAL (0x0010)。我想你可以掩蓋這一點,並讓這個班不是最終的。

相關問題