RFR: 8210943: Hiding of inner classes not resolved properly
Attila Szegedi
szegedia at gmail.com
Sat Dec 1 18:37:37 UTC 2018
Huh… so even within the single array returned from a single call to Classes.getClasses() we can have two classes of the same short name? I foolishly presumed this wouldn’t be the case. I guess in this case the full solution would indeed to provide an ordering on the classes, first on the name, then on whether one’s declaring class is a subclass of the other (I guess the number of superclasses is also a good proxy for that.)
Attila.
> On 2018. Dec 1., at 19:12, Hannes Wallnöfer <hannes.wallnoefer at oracle.com> wrote:
>
> Attila, the subclass-to-superclass traversal is actually not done in dynalink but directly in java.lang.Class.getClasses(). So Sundar has a point in that my code relies on implementation rather than specified behaviour of Class.getClasses().
>
> Now I do think it is highly unlikely that the order of classes returned by Classes.getClasses() would change in a future release. That would certainly break a lot of other code. Furthermore, if the order was reversed (superclasses to subclasses) that change would be caught by the test. The only change that could go unnoticed would be classes returned in random order, which I don’t think is a real concern. But of course we could choose to be defensive and add code that guards against it.
>
> Hannes
>
>
>> Am 01.12.2018 um 13:05 schrieb Attila Szegedi <szegedia at gmail.com>:
>>
>> The relevant Dynalink algorithm processes the class before moving on to superclass, so Hannes fix is correct in that we won’t stomp over a subclass’ inner class (inserted into the map earlier) with the superclass’ inner class (encountered later by the algorithm). So yeah, getClasses() doesn’t specify an order, but the Dynalink code has a subclass-towards-superclass traversal order.
>>
>> Attila.
>>
>>> On 2018. Dec 1., at 7:13, Sundararajan Athijegannathan <sundararajan.athijegannathan at oracle.com> wrote:
>>>
>>> Class.getClasses() javadoc does not mention anything about order of classes returned.
>>>
>>> https://docs.oracle.com/javase/10/docs/api/java/lang/Class.html#getClasses()
>>>
>>> Do we need a check using Class.getDeclaringClass() or do I something here?
>>>
>>> Thanks,
>>> -Sundar
>>>
>>> On 30/11/18, 4:44 PM, Attila Szegedi wrote:
>>>> +1. Thanks for fixing this.
>>>>
>>>>> On 2018. Nov 29., at 18:01, Hannes Wallnöfer<hannes.wallnoefer at oracle.com> wrote:
>>>>>
>>>>> Please review:
>>>>>
>>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8210943
>>>>> Webrev: http://cr.openjdk.java.net/~hannesw/8210943/webrev.00/
>>>>>
>>>>> AccessibleMembersLookup#lookupAccessibleMembers adds all nested classes returned by Class.getClasses(), but these may contain inherited classes that are shadowed and thus not visible from the current class. The solution is to make sure we use the first inner class with any given name.
>>>>>
>>>>> Thanks,
>>>>> Hannes
>>
>
More information about the nashorn-dev
mailing list