Ist es möglich, eine letzte Klasse mit Bytecode-Manipulationen zu erben?Ist es irgendwie möglich, einen endgültigen klassenmodifizierenden Bytecode zu erben?
Antwort
Ja und nein.
Sie können die Bytecode-Manipulation verwenden, um eine final
-Klasse im laufenden Betrieb in eine Nicht-final
-Klasse zu ändern. Dies beeinträchtigt nicht einmal die Binärkompatibilität, sodass keine Klassenlader/Verifier-Fehler auftreten.
Sie müssen jedoch die Bytecode-Änderungen an der Klasse final
selbst anwenden. Sie können keine Bytecode-Manipulation an einer untergeordneten Klasse vornehmen, um sie von einer übergeordneten Klasse final
zu erben. Oder genauer, wenn Sie das tun, wird die modifizierte Kindklasse vom Verifier zurückgewiesen, wenn sie zusammen mit der Elternklasse final
geladen wird.
Wenn Sie eine bestimmte Referenz haben wollen - JVMS Abschnitt 4.1, Seite 73 - "Weder die direkte Superklasse noch eine der Superklassen darf das ACC_FINAL-Flag im Attribut access_flags von seiner ClassFile-Struktur haben." – Antimony
Die JLS erwähnt dies auch - http://docs.oracle.com/javase/specs/jls/se7/html/jls-13.html#jls-13.4.2 –
Aber die Frage nach Bytecode-Manipulation, in welchem Fall die JLS ist irrelevant. Die Java-Sprache hat viele willkürliche Einschränkungen, die auf der Bytecode-Ebene nicht vorhanden sind. – Antimony
This beschreibt das Klassendateiformat. Am Offset 10+cpsize
gibt es 2 Bytes, die die Zugriffsflags dieser Klasse definieren. Eines dieser Flags heißt ACC_FINAL (0x0010). Ich nehme an, Sie können dieses Bit ausblenden und diese Klasse als nicht endgültig definieren.
- 1. Ist es irgendwie möglich Sync-Schleife mit Promises zu laufen?
- 2. Ist es irgendwie möglich, Segmentierungsfehler auf Ruby zu "retten"
- 3. QML Vorkompilierung zu Bytecode, ist das möglich?
- 4. Ist es möglich, MasterType programmatisch zu setzen?
- 5. Ist es möglich, einen Operationshaken zu entfernen?
- 6. Ist es möglich, einen Gradienten zu zeichnen?
- 7. Ist es möglich, einen ValueType zu klonen?
- 8. Ist es möglich, einen Subprozess zu erneuern?
- 9. Ist es möglich, einen Vorlagenalias zu erstellen?
- 10. Ist es möglich, einen Datenbanktransaktionsparameter zu verfälschen?
- 11. Ist es möglich, .NET-Versionen irgendwie zu aktualisieren, ohne Visual Studio-Versionen zu aktualisieren?
- 12. Ist es möglich, Enter as Tab zu verwenden, ohne JTextField oder massenhinzufügende Key Listener zu erben?
- 13. Ist es irgendwie möglich, Jobs in TestLink von Jenkins automatisch zu erstellen?
- 14. Ist es möglich, einen Funktionszeiger auf einen Konstruktor zu definieren?
- 15. Ist es möglich, einen OpenGL ES-Layer transparent zu machen?
- 16. ist es möglich, private Klasse zu erben, aber Mitglieder öffentlich zu machen?
- 17. Ist es möglich, die Ergebnisse des Befehls mv irgendwie rückgängig zu machen?
- 18. Ist es möglich, einen leeren Standardwert auf leftOuterJoin zu initialisieren?
- 19. Ist es möglich, ein Programm mit Java-Bytecode-Anweisungen direkt zu schreiben?
- 20. Ist es möglich, die Kontextwechselzeit zu reduzieren
- 21. Erben Legacy-COM-Architektur, ist es gut?
- 22. Ist es möglich, die Code-Indizierungsfunktionen von Eclipse zu entkoppeln?
- 23. Ist es in SASS möglich, von einer Klasse in einer anderen Datei zu erben?
- 24. Ist es möglich, die Old-Style-Klasse von der ECMAScript 6-Klasse in JavaScript zu erben?
- 25. Ist es möglich, einen Systemdienst in Android
- 26. Swagger: Ist es möglich, einen Operationsparameter konstant/schreibgeschützt zu machen?
- 27. Ist es möglich, einen Ausgabeparameter einer gespeicherten Prozedur zu ignorieren?
- 28. Ist es möglich, einen Webdienst mit der Formularauthentifizierung zu sichern?
- 29. Ist es möglich, einen Windows-Dienst mit Python zu schreiben?
- 30. Ist es möglich, einen neuen Rekord mit Linsen zu konstruieren?
Würde nicht "Komposition statt Vererbung" Ihr Problem lösen? Könnten Sie eine Wrapper-Klasse für das verwenden, was Sie tun möchten? Bitte posten Sie einige Details, es ist sehr schwierig, etwas zu beraten, wenn so wenig Informationen verfügbar sind ... (und vikingsteve hat Recht!) – ppeterka
'final' ist normalerweise aus einem bestimmten Grund da ... – vikingsteve
Welche Klasse versuchen Sie? geerbt von? Einer der Standardbibliotheken? –