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ę?
Odpowiedz
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
.
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
JLS również wspomina o tym - http://docs.oracle.com/javase/specs/jls/se7/html/jls-13.html#jls-13.4.2 –
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
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ą.
- 1. Możliwe jest użycie kodu lua w Unity3D
- 2. Czy jest możliwe dziedziczenie wielokrotne w VB .Net?
- 3. Czy jest jakiś znany sposób suszenia JSON
- 4. jest jakiś sposób wyłączenia optymalizacji kompilatora dla określonego wiersza kodu?
- 5. Czy jest jakiś sposób, aby atrybut title = działał w Chrome?
- 6. Czy jest jakiś sposób ograniczyć liczbę powtórzeń w danych podstawowych?
- 7. Czy jest jakiś sposób programowo ustawić nazwę aplikacji w Elmah?
- 8. Czy jest jakiś sposób na robienie argumentów w Spocku?
- 9. Czy jest jakiś sposób programowo wygenerować kod bajtowy Pythona?
- 10. czy możliwe jest osadzenie kodu HTML w alarmie alertify.js?
- 11. Czy możliwe jest wyświetlenie kodu HTML w Wordpress?
- 12. Czy jest jakiś skrótowy sposób na uzyskanie float z tablicy?
- 13. Czy możliwe jest przeglądanie plików klasy Java według kodu bajtowego
- 14. Czy jest jakiś sposób, aby wyświetlić plan wykonania programu?
- 15. Czy jest jakiś sposób sprawdzenia zainstalowanej wersji Gulp?
- 16. Czy jest jakiś sposób domyślnie użyć atrybutu JavaScript?
- 17. OCMock - weryfikacja kolejności wywołań metod. Czy jest jakiś inny sposób?
- 18. Czy jest jakiś sposób na stworzenie łatki do przeglądu?
- 19. Czy jest jakiś sposób, aby Guice Grapher zadziałał?
- 20. Czy jest jakiś sposób poznania pid z uruchomionego programu?
- 21. Czy jest jakiś sposób dodania ikony do paska Snackbar?
- 22. Czy jest jakiś sposób na uzyskanie czasu trwania trwającego przekodowywania?
- 23. Czy jest jakiś sposób wyłączenia panoramowania na tabletach - stronie internetowej?
- 24. Czy jest jakiś sposób użyć nowego DrawerLayout z ActionBarSharlock?
- 25. Czy możliwe jest generowanie zwykłego kodu XML przy użyciu Haml?
- 26. Czy możliwe jest formatowanie kodu C++ za pomocą VIM?
- 27. Czy jest możliwe dynamiczne kompilowanie i wykonywanie fragmentów kodu C#?
- 28. W jaki sposób dziedziczenie działa dla atrybutów?
- 29. Czy w JavaScript jest możliwe metaprogramowanie?
- 30. Czy w Scali jest jakiś silnik gry?
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
'final' jest zwykle tam z jakiegoś powodu ... – vikingsteve
Które klasy próbujesz dziedziczą z? Jedna ze standardowych bibliotek? –