È possibile ereditare una classe finale utilizzando le manipolazioni di bytecode?E 'possibile ereditare una classe finale modificando il bytecode in qualche modo?
risposta
Sì e no.
È possibile utilizzare la manipolazione bytecode per modificare una classe final
su non-final
al volo. Questo non rompe nemmeno la compatibilità binaria, quindi non vi è alcun rischio di errori di loader/verificatore di classe.
Tuttavia, è necessario applicare le modifiche del codice bytecode alla classe final
stessa. Non è possibile eseguire la manipolazione bytecode su una classe figlio per farla ereditare da una classe genitore final
. O più precisamente, se lo fai, la classe figlia modificata verrà respinta dal verificatore quando caricata insieme alla classe genitore final
.
Se si desidera un riferimento specifico - sezione JVMS 4.1, pagina 73 - "Né la superclasse diretta né alcuna delle superclassi possono avere il flag ACC_FINAL impostato nell'elemento access_flags di nella struttura ClassFile." – Antimony
Il JLS menziona anche questo - http://docs.oracle.com/javase/specs/jls/se7/html/jls-13.html#jls-13.4.2 –
Ma la domanda posta sulla manipolazione del bytecode, nel qual caso il JLS è irrilevante. Il linguaggio Java ha tonnellate di restrizioni arbitrarie che non sono presenti a livello di bytecode. – Antimony
This descrive il formato del file di classe. All'offset 10+cpsize
ci sono 2 byte che definiscono i flag di accesso di questa classe. Uno di questi flag si chiama ACC_FINAL (0x0010). Suppongo che tu possa mascherare quel bit e rendere quella classe non definitiva.
- 1. E 'possibile ereditare da MKPolyline
- 2. Modificatore 'finale' variabile perso in Bytecode?
- 3. E 'possibile visualizzare un codice di classe Java bytecode
- 4. Metodo finale proxy in Classe non finale
- 5. È possibile trasformare il bytecode LLVM in bytecode Java?
- 6. E 'possibile in SASS ereditare da una classe in un altro file?
- 7. Come ereditare una classe C++ in JavaScript?
- 8. Metodi non finali in una classe finale
- 9. E 'possibile in qualche modo escludere file con cfdirectory?
- 10. Come estendere una classe finale in Java
- 11. Scala: finale statico pubblico in una classe
- 12. Ottieni bytecode dalla classe caricata
- 13. C'è un modo per ottenere il bytecode per una classe in fase di esecuzione?
- 14. Sta modificando una variabile di classe in python threadsafe?
- 15. Come definire una classe ereditare must
- 16. Equivalente all'estensione di una classe finale in Java
- 17. E 'possibile per la classe di ereditare le annotaions della classe super-
- 18. È possibile ereditare un python @classmethod?
- 19. Java: è possibile avere riferimenti di classe finale reciproci?
- 20. Qualche modo possibile per riprogrammare il microcontrollore di un'unità USB?
- 21. implementazione della classe "finale" in C++
- 22. In C#, una classe può ereditare da un'altra classe e un'interfaccia?
- 23. Impossibile ereditare da una classe Thread in C#?
- 24. Il bytecode di una classe può cambiare se una classe/interfaccia genitore cambia?
- 25. È possibile ereditare la classe vecchio stile dalla classe ECMAScript 6 in JavaScript?
- 26. Pre-compilazione QML in bytecode, è possibile?
- 27. Modo corretto per ereditare da std :: exception
- 28. E 'possibile avere un periodo finale in user.name in Git?
- 29. Come posso ereditare una classe personalizzata da più superclassi?
- 30. Scegliere dinamicamente la classe da ereditare da
La "composizione anziché l'ereditarietà" non risolve il problema? Potresti usare una classe wrapper per quello che stai cercando di fare? Per favore pubblica alcuni dettagli, è molto difficile consigliare qualcosa se sono disponibili così poche informazioni ... (e vikingsteve ha ragione!) – ppeterka
'final' è di solito lì per un motivo ... – vikingsteve
Quale classe stai provando a ereditato da? Uno di quelli standard della biblioteca? –