Code review request for 6543593 "(reflect) Clarify private final field mutability"
Joe Darcy
joe.darcy at oracle.com
Mon Apr 4 07:46:16 UTC 2011
Hi David.
David Holmes wrote:
> Hi Joe,
>
> I'm not sure exactly what Bill was complaining about here,
His specific issue was addressed by the diff
* <p>If the underlying field is final, the method throws an
- * {@code IllegalAccessException} unless
- * {@code setAccessible(true)} has succeeded for this field
- * and this field is non-static. Setting a final field in this way
+ * {@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
* 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
@@ -658,8 +667,9 @@
* @param value the new value for the field of {@code obj}
* being modified
In other words, setAccessible(true) can succeed on a
java.lang.reflect.Field object but not on a field.
> but using the same phrasing as Method and Constructor is a good thing.
> However, as the CR pertains in particular to the issue of final
> fields, I think for the setXXX cases the "@exception**
> IllegalAccessException" javadoc should also mention that it can be
> thrown because the field is final, not just because it is inaccessible.
Fair enough. How about just for the setter methods
+ * @exception IllegalAccessException if this {@code Field} object
+ * enforces Java language access control and the
underlying
+ * field is inaccessible or is final.
>
> ** shouldn't all those @exception tags get converted to @throws?
That would certainly be my style recommendation, but I wasn't looking to
make that change at the moment.
Thanks,
-Joe
>
> David
>
> Joe Darcy said the following on 04/04/11 16:32:
>> Hello.
>>
>> Please review the more precise wording added to
>> java.lang.reflect.Field to address bug
>>
>> 6543593 "(reflect) Clarify private final field mutability"
>> http://cr.openjdk.java.net/~darcy/6543593.0/
>>
>> Full patch below.
>>
>> In describing when IllegalAccessException is thrown, Field now uses
>> phrasing consistent with that used by its sibling classes Method and
>> Constructor:
>>
>> "if this Method object enforces Java language access control and the
>> underlying method is inaccessible."
>> "if this Constructor object enforces Java language access control and
>> the underlying constructor is inaccessible."
>>
>> Thanks,
>>
>> -Joe
>>
>> --- old/src/share/classes/java/lang/reflect/Field.java 2011-04-03
>> 23:25:40.000000000 -0700
>> +++ new/src/share/classes/java/lang/reflect/Field.java 2011-04-03
>> 23:25:39.000000000 -0700
>> @@ -360,8 +360,9 @@
>> * {@code obj}; primitive values are wrapped in an appropriate
>> * object before being returned
>> *
>> - * @exception IllegalAccessException if the underlying field
>> - * is inaccessible.
>> + * @exception IllegalAccessException if this {@code Field}
>> object
>> + * enforces Java language access control and the
>> underlying
>> + * field is inaccessible.
>> * @exception IllegalArgumentException if the specified object
>> is not an
>> * instance of the class or interface declaring the
>> underlying
>> * field (or a subclass or implementor thereof).
>> @@ -383,8 +384,9 @@
>> * from
>> * @return the value of the {@code boolean} field
>> *
>> - * @exception IllegalAccessException if the underlying field
>> - * is inaccessible.
>> + * @exception IllegalAccessException if this {@code Field}
>> object
>> + * enforces Java language access control and the
>> underlying
>> + * field is inaccessible.
>> * @exception IllegalArgumentException if the specified object
>> is not
>> * an instance of the class or interface declaring the
>> * underlying field (or a subclass or implementor
>> @@ -410,8 +412,9 @@
>> * from
>> * @return the value of the {@code byte} field
>> *
>> - * @exception IllegalAccessException if the underlying field
>> - * is inaccessible.
>> + * @exception IllegalAccessException if this {@code Field}
>> object
>> + * enforces Java language access control and the
>> underlying
>> + * field is inaccessible.
>> * @exception IllegalArgumentException if the specified object
>> is not
>> * an instance of the class or interface declaring the
>> * underlying field (or a subclass or implementor
>> @@ -439,8 +442,9 @@
>> * from
>> * @return the value of the field converted to type {@code char}
>> *
>> - * @exception IllegalAccessException if the underlying field
>> - * is inaccessible.
>> + * @exception IllegalAccessException if this {@code Field}
>> object
>> + * enforces Java language access control and the
>> underlying
>> + * field is inaccessible.
>> * @exception IllegalArgumentException if the specified object
>> is not
>> * an instance of the class or interface declaring the
>> * underlying field (or a subclass or implementor
>> @@ -468,8 +472,9 @@
>> * from
>> * @return the value of the field converted to type {@code short}
>> *
>> - * @exception IllegalAccessException if the underlying field
>> - * is inaccessible.
>> + * @exception IllegalAccessException if this {@code Field}
>> object
>> + * enforces Java language access control and the
>> underlying
>> + * field is inaccessible.
>> * @exception IllegalArgumentException if the specified object
>> is not
>> * an instance of the class or interface declaring the
>> * underlying field (or a subclass or implementor
>> @@ -497,8 +502,9 @@
>> * from
>> * @return the value of the field converted to type {@code int}
>> *
>> - * @exception IllegalAccessException if the underlying field
>> - * is inaccessible.
>> + * @exception IllegalAccessException if this {@code Field}
>> object
>> + * enforces Java language access control and the
>> underlying
>> + * field is inaccessible.
>> * @exception IllegalArgumentException if the specified object
>> is not
>> * an instance of the class or interface declaring the
>> * underlying field (or a subclass or implementor
>> @@ -526,8 +532,9 @@
>> * from
>> * @return the value of the field converted to type {@code long}
>> *
>> - * @exception IllegalAccessException if the underlying field
>> - * is inaccessible.
>> + * @exception IllegalAccessException if this {@code Field}
>> object
>> + * enforces Java language access control and the
>> underlying
>> + * field is inaccessible.
>> * @exception IllegalArgumentException if the specified object
>> is not
>> * an instance of the class or interface declaring the
>> * underlying field (or a subclass or implementor
>> @@ -555,8 +562,9 @@
>> * from
>> * @return the value of the field converted to type {@code float}
>> *
>> - * @exception IllegalAccessException if the underlying field
>> - * is inaccessible.
>> + * @exception IllegalAccessException if this {@code Field}
>> object
>> + * enforces Java language access control and the
>> underlying
>> + * field is inaccessible.
>> * @exception IllegalArgumentException if the specified object
>> is not
>> * an instance of the class or interface declaring the
>> * underlying field (or a subclass or implementor
>> @@ -584,8 +592,9 @@
>> * from
>> * @return the value of the field converted to type {@code double}
>> *
>> - * @exception IllegalAccessException if the underlying field
>> - * is inaccessible.
>> + * @exception IllegalAccessException if this {@code Field}
>> object
>> + * enforces Java language access control and the
>> underlying
>> + * field is inaccessible.
>> * @exception IllegalArgumentException if the specified object
>> is not
>> * an instance of the class or interface declaring the
>> * underlying field (or a subclass or implementor
>> @@ -626,9 +635,9 @@
>> * {@code IllegalAccessException}.
>> *
>> * <p>If the underlying field is final, the method throws an
>> - * {@code IllegalAccessException} unless
>> - * {@code setAccessible(true)} has succeeded for this field
>> - * and this field is non-static. Setting a final field in this way
>> + * {@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
>> * 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
>> @@ -658,8 +667,9 @@
>> * @param value the new value for the field of {@code obj}
>> * being modified
>> *
>> - * @exception IllegalAccessException if the underlying field
>> - * is inaccessible.
>> + * @exception IllegalAccessException if this {@code Field}
>> object
>> + * enforces Java language access control and the
>> underlying
>> + * field is inaccessible.
>> * @exception IllegalArgumentException if the specified object
>> is not an
>> * instance of the class or interface declaring the
>> underlying
>> * field (or a subclass or implementor thereof),
>> @@ -686,8 +696,9 @@
>> * @param z the new value for the field of {@code obj}
>> * being modified
>> *
>> - * @exception IllegalAccessException if the underlying field
>> - * is inaccessible.
>> + * @exception IllegalAccessException if this {@code Field}
>> object
>> + * enforces Java language access control and the
>> underlying
>> + * field is inaccessible.
>> * @exception IllegalArgumentException if the specified object
>> is not an
>> * instance of the class or interface declaring the
>> underlying
>> * field (or a subclass or implementor thereof),
>> @@ -715,8 +726,9 @@
>> * @param b the new value for the field of {@code obj}
>> * being modified
>> *
>> - * @exception IllegalAccessException if the underlying field
>> - * is inaccessible.
>> + * @exception IllegalAccessException if this {@code Field}
>> object
>> + * enforces Java language access control and the
>> underlying
>> + * field is inaccessible.
>> * @exception IllegalArgumentException if the specified object
>> is not an
>> * instance of the class or interface declaring the
>> underlying
>> * field (or a subclass or implementor thereof),
>> @@ -744,8 +756,9 @@
>> * @param c the new value for the field of {@code obj}
>> * being modified
>> *
>> - * @exception IllegalAccessException if the underlying field
>> - * is inaccessible.
>> + * @exception IllegalAccessException if this {@code Field}
>> object
>> + * enforces Java language access control and the
>> underlying
>> + * field is inaccessible.
>> * @exception IllegalArgumentException if the specified object
>> is not an
>> * instance of the class or interface declaring the
>> underlying
>> * field (or a subclass or implementor thereof),
>> @@ -773,8 +786,9 @@
>> * @param s the new value for the field of {@code obj}
>> * being modified
>> *
>> - * @exception IllegalAccessException if the underlying field
>> - * is inaccessible.
>> + * @exception IllegalAccessException if this {@code Field}
>> object
>> + * enforces Java language access control and the
>> underlying
>> + * field is inaccessible.
>> * @exception IllegalArgumentException if the specified object
>> is not an
>> * instance of the class or interface declaring the
>> underlying
>> * field (or a subclass or implementor thereof),
>> @@ -802,8 +816,9 @@
>> * @param i the new value for the field of {@code obj}
>> * being modified
>> *
>> - * @exception IllegalAccessException if the underlying field
>> - * is inaccessible.
>> + * @exception IllegalAccessException if this {@code Field}
>> object
>> + * enforces Java language access control and the
>> underlying
>> + * field is inaccessible.
>> * @exception IllegalArgumentException if the specified object
>> is not an
>> * instance of the class or interface declaring the
>> underlying
>> * field (or a subclass or implementor thereof),
>> @@ -831,8 +846,9 @@
>> * @param l the new value for the field of {@code obj}
>> * being modified
>> *
>> - * @exception IllegalAccessException if the underlying field
>> - * is inaccessible.
>> + * @exception IllegalAccessException if this {@code Field}
>> object
>> + * enforces Java language access control and the
>> underlying
>> + * field is inaccessible.
>> * @exception IllegalArgumentException if the specified object
>> is not an
>> * instance of the class or interface declaring the
>> underlying
>> * field (or a subclass or implementor thereof),
>> @@ -860,8 +876,9 @@
>> * @param f the new value for the field of {@code obj}
>> * being modified
>> *
>> - * @exception IllegalAccessException if the underlying field
>> - * is inaccessible.
>> + * @exception IllegalAccessException if this {@code Field}
>> object
>> + * enforces Java language access control and the
>> underlying
>> + * field is inaccessible.
>> * @exception IllegalArgumentException if the specified object
>> is not an
>> * instance of the class or interface declaring the
>> underlying
>> * field (or a subclass or implementor thereof),
>> @@ -889,8 +906,9 @@
>> * @param d the new value for the field of {@code obj}
>> * being modified
>> *
>> - * @exception IllegalAccessException if the underlying field
>> - * is inaccessible.
>> + * @exception IllegalAccessException if this {@code Field}
>> object
>> + * enforces Java language access control and the
>> underlying
>> + * field is inaccessible.
>> * @exception IllegalArgumentException if the specified object
>> is not an
>> * instance of the class or interface declaring the
>> underlying
>> * field (or a subclass or implementor thereof),
>>
More information about the core-libs-dev
mailing list