Code review request for 6543593 "(reflect) Clarify private final field mutability"
David Holmes
David.Holmes at oracle.com
Mon Apr 4 22:31:54 UTC 2011
Joe Darcy said the following on 04/04/11 17:46:
> David Holmes wrote:
>> I'm not sure exactly what Bill was complaining about here,
>
> His specific issue was addressed by the diff
<snip> ...
> In other words, setAccessible(true) can succeed on a
> java.lang.reflect.Field object but not on a field.
Which is exactly what makes no sense to me - how could you possibly
construe that setAccessible is applied to a field as opposed to a Field
object ??? Anyway ...
>> 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.
The latest version of this is fine.
>> ** 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.
Strike while the iron is hot :)
Cheers,
David
> 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