2013-02-25 6 views
6

Czy możliwe jest dziedziczenie ostatniej klasy przy użyciu operacji kodu bajtowego?Czy w jakiś sposób możliwe jest dziedziczenie kodu końcowego modyfikującego klasę?

+1

Czy "kompozycja zamiast dziedziczenia" nie rozwiązałaby problemu? Czy możesz użyć klasy opakowania dla tego, co próbujesz zrobić? Proszę napisać kilka szczegółów, bardzo trudno jest doradzić, jeśli tak mała ilość informacji jest dostępna ... (i vikingsteve ma rację!) – ppeterka

+5

'final' jest zwykle tam z jakiegoś powodu ... – vikingsteve

+0

Które klasy próbujesz dziedziczą z? Jedna ze standardowych bibliotek? –

Odpowiedz

4

Tak i nie.

Możesz użyć kodu bajtowego, aby zmienić klasę final na inną niż final w locie. Nie narusza to nawet zgodności binarnej, więc nie ma ryzyka błędów modułu ładującego klasy/weryfikatora.

Jednak należy zastosować modyfikacje kodu bajtowego do samej klasy final. Nie można manipulować kodami bajtowymi w klasie potomnej, aby dziedziczyła ona z klasy nadrzędnej final. A dokładniej, jeśli to zrobisz, zmodyfikowana klasa potomna zostanie odrzucona przez weryfikator po załadowaniu razem z klasą nadrzędną final.

+0

Aby uzyskać konkretne odniesienie - sekcja 4.1 JVMS, strona 73 - "Ani nadklasy bezpośrednie, ani żadna z nich nie mogą mieć flagi ACC_FINAL ustawionej w elemencie access_flags o numerze o strukturze ClassFile." – Antimony

+0

JLS również wspomina o tym - http://docs.oracle.com/javase/specs/jls/se7/html/jls-13.html#jls-13.4.2 –

+0

Ale pytanie o manipulację kodu bajtowego, w którym to przypadku JLS nie ma znaczenia. Język Java ma mnóstwo arbitralnych ograniczeń, których nie ma na poziomie kodu bajtowego. – Antimony

0

This opisuje format pliku klasy. W offsecie 10+cpsize są 2 bajty określające flagi dostępu tej klasy. Jedna z tych flag nosi nazwę ACC_FINAL (0x0010). Przypuszczam, że możesz zamaskować ten fragment i uczynić tę klasę nieostateczną.

Powiązane problemy