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