Final heißt final: Warum 2 + 2 bald nicht mehr 5 ergeben darf
2 + 2 ergibt 5. Und ein String-Literal ändert seinen Inhalt – nicht an einer Stelle, sondern überall im Programm. Beides geht in Java, mit Deep Reflection: setAccessible(true) und dem Überschreiben von final-Feldern.
Was wie ein Partytrick aussieht, ist ein erhebliches Risiko für die Laufzeitintegrität. Zentrale Invarianten lassen sich aushebeln, Sicherheitsannahmen brechen, scheinbar unveränderliche Objekte manipulieren – und genau das macht Deep Reflection zu einem attraktiven Werkzeug für Angreifer.
Aber auch ohne böse Absicht wird es teuer: Constant Folding, eine der grundlegendsten JVM-Optimierungen, funktioniert nur, wenn ein Wert wirklich konstant bleibt.
Wir schauen uns diese Gefahr nicht nur theoretisch, sondern ganz konkret an. Per Live Coding zeige ich, wie sich mit Deep Reflection interne Zustände verändern lassen – und wie ein Angreifer damit Sicherheitsannahmen aushebeln kann.
Genau hier setzt JEP 500 an, „Prepare to Make Final Mean Final“. Die JVM warnt, wenn Code ein final-Feld per Deep Reflection überschreibt; in einer künftigen Version fliegt eine Exception. Deep Reflection verliert damit ihre zerstörerischste Fähigkeit – zumindest dort, wo Integrität wichtiger ist als maximale Flexibilität. Du siehst live, wie dieselben Angriffe mit einer modernen Java-Version auffliegen – und wie du sie verhindern kannst.
Zum Schluss spannen wir den Bogen zu „Integrity by Default“ – als nächsten Schritt eines Plans, den Java seit dem Modulsystem in Version 9 verfolgt.



