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 <szege...@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.athijegannat...@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.wallnoe...@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
> 

Reply via email to