Review Request JDK-8202113: Reflection API is causing caller classes to leak

Peter Levart peter.levart at gmail.com
Mon May 14 15:43:34 UTC 2018



On 05/11/2018 06:09 PM, mandy chung wrote:
>
>
> On 4/30/18 10:21 AM, Alan Bateman wrote:
>>
>> The updated webrev looks good. A minor comment is that I assume you 
>> can remove the cast from Executable::declaredAnnotations if you leave 
>> Executable::getRoot in place.
>
> It could but leave it as is.  I found that this change breaks the hack 
> that uses reflection to change a static final field by changing the 
> private modifiers field in the Field object. That is a terrible hack 
> but I think it's better to separate this incompatibility from this 
> issue.  I modified the fix to change the modifiers of the root and 
> child field object be the same.
>
> http://cr.openjdk.java.net/~mchung/jdk11/webrevs/8202113/webrev.02/
>
> Mandy

Hi Mandy,

Sorry for noticing this too late, but...

If it was not necessary to keep legacy hacky behavior (to honor the 
patched "modifiers" field), wouldn't it be cleaner to leave the 
ReflectionFactory as is, but modify the following private methods instead:

- Field#acquireFieldAccessor
- Method#acquireMethodAccessor
- Constructor#acquireConstructorAccessor

They already deal with 'root' object and could pass it to 
ReflectionFactory. The logic of ReflectionFactory need not deal with the 
notion of 'root' object then and no LangReflectAccess additions are 
necessary. You would keep the notion of root objects encapsulated. With 
tour patch it has leaked into ReflectionFactory too.

Is it really that important to allow users to modify static final fields 
that way? As such fields are normally constant folded by JIT, I doubt 
that anybody is doing it nowadays. Doing it is bound to unpredictable 
program behavior, as JVM is free to never reload such field's value.

Regards, Peter



More information about the core-libs-dev mailing list