[nestmates] JDK-8235602: Re-examine if a hidden class should trust final non static fields

Mandy Chung mandy.chung at oracle.com
Thu Jan 30 18:33:23 UTC 2020

Hi Paul,

I tweak Field::set a little to define "write access" which will be
mentioned from Field::setXXX @throws (I missed to change @throw in
the previous patch).

diff --git a/src/java.base/share/classes/java/lang/reflect/Field.java b/src/java.base/share/classes/java/lang/reflect/Field.java
--- a/src/java.base/share/classes/java/lang/reflect/Field.java
+++ b/src/java.base/share/classes/java/lang/reflect/Field.java
@@ -721,10 +721,19 @@
       * the underlying field is inaccessible, the method throws an
       * {@code IllegalAccessException}.
-     * <p>If the underlying field is final, the method throws an
-     * {@code IllegalAccessException} unless {@code setAccessible(true)}
-     * has succeeded for this {@code Field} object
-     * and the field is non-static. Setting a final field in this way
+     * <p>If the underlying field is final, this {@code Field} object has
+     * <em>write</em> access if and only if the following conditions are met:
+     * <ul>
+     * <li>{@link #setAccessible(boolean) setAccessible(true)} has succeeded for
+     *     this {@code Field} object;</li>
+     * <li>the field is non-static; and</li>
+     * <li>the field's declaring class is not a {@linkplain Class#isHiddenClass() hidden}
+     *     class.</li>
+     * </ul>
+     * If any of the above checks is {@code false}, this method throws an
+     * {@code IllegalAccessException}.
+     *
+     * <p> Setting a final field in this way
       * is meaningful only during deserialization or reconstruction of
       * instances of classes with blank final fields, before they are
       * made available for access by other parts of a program. Use in
@@ -756,7 +765,8 @@
       * @throws    IllegalAccessException    if this {@code Field} object
       *              is enforcing Java language access control and the underlying
-     *              field is either inaccessible or final.
+     *              field is inaccessible or final;
+     *              or if this {@code Field} object has no write access.

The above change to @throws IAE also applies to other Field::setXXX methods.


More information about the valhalla-dev mailing list