[Nestmates] Add a core reflection API to get nestmate information

Peter Levart peter.levart at gmail.com
Mon Nov 20 09:20:24 UTC 2017


Hi David,

On 11/20/2017 07:36 AM, David Holmes wrote:
>>>> I don't quite understand why should a Class.isNestmateOf(Class) 
>>>> behave any differently than real VM access check.
>>>
>>> Purely because of the difference in exception handling. The view was 
>>> that the reflection API should mostly "absorb" exceptions.
>>
>> Absorbing exceptions is generally a bad idea. In this particular 
>> case, you are trying to hide an implementation detail and instead lie 
>> to the user about the nest membership. Some information is lost on 
>> the way and that's not helping the user at all. Not being in the same 
>> nest and not being able to evaluate the answer are two different 
>> things and as much as someone might think the user shouldn't care, 
>> the need to discriminate them is probably going to arise and users 
>> will have to do sub-optimal things to accomplish that. Why not give 
>> them the precise tool to start with?
>
> That was my personal initial position too. But the EG discussions went 
> elsewhere:
>
> http://mail.openjdk.java.net/pipermail/valhalla-spec-experts/2017-October/000386.html 
>
>
> Cheers,
> David 

Your comment in the issue:

https://bugs.openjdk.java.net/browse/JDK-8187768?focusedCommentId=14123862&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-14123862

...describes how access checking for private members behaves in VM and 
what are the outcomes when class attributes are missing or not 
consistent (access is denied - IllegalAccessError is thrown) vs. when 
nest-host class can not be resolved (NoClassDefFoundError is thrown). I 
think this is sound.

In reflective API, it is common practice for IllegalAccessException to 
be thrown where VM would throw IllegalAccessError, but 
NoClassDefFoundError is thrown as is when various reflective methods are 
invoked. For example, Class.getDeclaredField(fieldName) throws 
NoClassDefFoundError when the field's type can not be resolved. Likewise 
for method's and constructor's parameter types. Class.getDeclaredField() 
is not trying to hide the return type resolution error by lying about 
the existence of the field and throwing NoSuchFieldException instead. So 
why should Class.isNestmateOf(Class) hide the NoClassDefFoundError and 
lie about nest membership instead?

I agree that Class.getNestMembers() is a special case, but I think it 
should nevertheless propagate NoClassDefFoundError when nest-host can 
not be resolved, while resolution errors for other nest-members listed 
in nest-host could just skip them from the result (to allow for 
optimized jars). Although maybe, jar optimizers should rather "patch" 
the nest-host attribute and remove members that are not included. They 
would have to be aware of nestmate attributes to not accidentally remove 
the nest-host class from the optimized jar anyway, or rearrange 
attributes to designate one of remaining classes to be new nest-host in 
optimized jar.

Regards, Peter



More information about the valhalla-spec-observers mailing list