In Java SE 5.0, the JVM Specification tightened up checks for putfield and putstatic bytecodes targeting final fields. For example, putfield changed in the following way:
- JVMS Second Edition (1999, prior to Java SE 5.0) [1]: "Otherwise, if the field is final, it must be declared in the current class. Otherwise, an IllegalAccessError is thrown."
- JVMS updates for Java SE 5.0 (2004) [2]: "Otherwise, if the field is final, it must be declared in the current class, and the instruction must occur in an instance initialization method (<init>) of the current class. Otherwise, an IllegalAccessError is thrown."
The HotSpot VM did not implement the new checks untilJDK-8157181. However, the changes by JDK-8157181 have introduced the checks only for class files with version 9 and onwards.
The goal of the current bug is to investigate if the new checks should be tightened up to Java 7 and/or 8.
[1] JVMS Second Edition, section 6.4: https://docs.oracle.com/javase/specs/jvms/se6/html/Instructions2.doc11.html
[2] JVMS updates for Java SE 5.0: https://jcp.org/aboutJava/communityprocess/maintenance/jsr924/index.html -> open "The Java Virtual Machine Instruction Set" -> jump to putfield.
- JVMS Second Edition (1999, prior to Java SE 5.0) [1]: "Otherwise, if the field is final, it must be declared in the current class. Otherwise, an IllegalAccessError is thrown."
- JVMS updates for Java SE 5.0 (2004) [2]: "Otherwise, if the field is final, it must be declared in the current class, and the instruction must occur in an instance initialization method (<init>) of the current class. Otherwise, an IllegalAccessError is thrown."
The HotSpot VM did not implement the new checks until
The goal of the current bug is to investigate if the new checks should be tightened up to Java 7 and/or 8.
[1] JVMS Second Edition, section 6.4: https://docs.oracle.com/javase/specs/jvms/se6/html/Instructions2.doc11.html
[2] JVMS updates for Java SE 5.0: https://jcp.org/aboutJava/communityprocess/maintenance/jsr924/index.html -> open "The Java Virtual Machine Instruction Set" -> jump to putfield.
- is blocked by
-
JDK-8157181 Compilers accept modification of final fields outside initializer methods
-
- Resolved
-
-
JDK-8160527 Check for final instance field updates can be omitted
-
- Resolved
-
- relates to
-
JDK-8190783 Exception when executing switch statement in static interface method
-
- Closed
-