RFR: JDK-8216558: Lookup.unreflectSetter(Field) fails to throw IllegalAccessException for final fields
mandy.chung at oracle.com
Sat Jan 12 00:13:31 UTC 2019
On 1/11/19 3:03 PM, David Holmes wrote:
> On 12/01/2019 8:47 am, Mandy Chung wrote:
>> On 1/11/19 2:38 PM, David Holmes wrote:
>>> There seem to be a number of spec issues around this. Shouldn't
>>> findStaticSetter say something about what happens when the field is
>>> final? Same for findSetter? This issue seems to be much bigger than
>>> just a simple bug fix.
>> I don't see any issue with the spec for findSetter and
>> findStaticSetter. findSetter returns a method handle equivalent to
>> `putField` bytecode and it throws IAE when access checking is
>> performed since it's final and not writeable. Similiarly for
> Well that is what it does, but it doesn't explicitly mention final
> fields and the @throws information for IAE:
> IllegalAccessException - if access checking fails, or if the field
> is static
> doesn't convey anything about getting IAE for a final field. Perhaps
> it is implicit in the "this behaves like bytecode" but it is very
I assume you agree that there is no spec issue w.r.t. findSetter or
findStaticSetter while you may find it obscure.
>>> A CSR request will need to be filed.
>> Of course, as this is a spec change.
> I'm unclear what spec is actually to be changed here and in what way?
I expect Adam will send a revised webrev to include the proposed spec
> If these methods produce MH that obey bytecode semantics then the fact
> the Field had setAccessible(true) called on it is not relevant - the
> JVMS knows nothing about setAccessible. The only issue I see is the
> implementation not throwing IAE when the Field represents a final
> field, because it examines the "accessibility" state. (And that should
> apply whether the field is static or not.)
This is the current implementation matching the specification:
If the field's accessible flag is not set, access checking is
performed immediately on behalf of the lookup class.
I think it's intended to match Field::setAccessible behavior but
Field::setAccessible has no effect in suppressing the language access
check in static final field. Hence I agree with Adam's fix changes that
the access check should be performed for static final field even its
accessible flag is set.
More information about the core-libs-dev