Hi Caes,

As we discussed off list the post loop logic is easily missed.

However, i found another obvious issue i missed with two classes (super/sub) 
extending from the same interface that declares a field. See updated test case 
in the webrev.

I have an idea to retain Field[] arrays and then process ‘em all at the end of 
the method to produce the final array. That should hopefully make the logic 
clearer too.

Paul.


> On 29 Nov 2017, at 16:00, Claes Redestad <claes.redes...@oracle.com> wrote:
> 
> Hi Paul,
> 
> it seems you'll effectively skip processing of the last interface of c in the 
> new code - is this intentional?
> 
> 3049         Field[] iFields = null;
> 3050         for (Class<?> c : getInterfaces()) {
> 3051             if (iFields != null && iFields.length > 0) {
> ...
> 3060             }
> 3061             iFields = c.privateGetPublicFields();
> 3062         }
> 
> ifaces is unused:
> 
> 3047         Class<?>[] ifaces = getInterfaces();
> 
> Nit: You could probably simplify code by replacing List<Field> fields with 
> the LinkedHashSet directly, removing the need to create it conditionally.
> 
> /Claes
> 
> 
> On 2017-11-29 21:15, Paul Sandoz wrote:
>> Hi,
>> 
>> Please review:
>> 
>>   
>> http://cr.openjdk.java.net/~psandoz/jdk10/JDK-8186961-iface-static-fields-get/webrev/
>>  
>> <http://cr.openjdk.java.net/~psandoz/jdk10/JDK-8186961-iface-static-fields-get/webrev/>
>> 
>> There is a bug lurking, perhaps for a while, where diamond patterns for 
>> interface hierarchies can result in the incorrect reporting of fields when 
>> using reflection, see the test case.
>> 
>> Since reflection data is cached i don’t see an advantage to retaining a set 
>> of of traversed interfaces, which is the root cause of the issue.
>> 
>> The code is optimized for common cases and will for less common cases 
>> collect fields of interfaces into a temporary linked hash set (to preserve 
>> the order, perhaps not strictly necessary but i did not want to change that 
>> behaviour).
>> 
>> Thanks,
>> Paul.
> 

Reply via email to