RFR 9 and 8u: JDK-8029674: (reflect) getMethods returns default methods that are not members of the class

Joel Borggrén-Franck joel.franck at oracle.com
Mon Jun 9 16:33:40 UTC 2014


Hi Joe,

IIRC name isn’t actually interned with String.intern() but in the VM:s Symbol table as a name representing a (Java) method. Should be equivalent, as long as we don’t start comparing it with == with interned Strings. As Andrej wrote, this is just refactoring of the previous code, to reuse the logic.

cheers
/Joel

On 07 Jun 2014, at 22:34, Andrej Golovnin <andrej.golovnin at gmail.com> wrote:

> Hi Joe,
> 
>> Sorry for the belated review.
>> 
>> Generally the change looks good. One question, in
>> 
>> 2803         private boolean matchesNameAndDescriptor(Method m1, Method m2) {
>> 2804             return m1.getReturnType() == m2.getReturnType() &&
>> 2805                    m1.getName() == m2.getName() &&
>> 2806                    arrayContentsEq(m1.getParameterTypes(),
>> 2807                            m2.getParameterTypes());
>> 2808         }
>> 
>> Should the equality check on 2805 be .equals rather than == ?
>> 
> 
> "==" can be used in this case as the method name is interned by JVM. 
> Here is the comment for the field "name" from java.lang.reflect.Method:
> 
>   // This is guaranteed to be interned by the VM in the 1.4
>   // reflection implementation
>   private String              name;
> 
> BTW, in the old version of Class in the line 2766 there was already a similar check:
> 
> 2764                 if (m != null &&
> 2765                     m.getReturnType() == toRemove.getReturnType() &&
> 2766                     m.getName() == toRemove.getName() &&
> 2767                     arrayContentsEq(m.getParameterTypes(),
> 2768                                     toRemove.getParameterTypes())) {
> 2769                     methods[i] = null;
> 
> 
> Best regards,
> Andrej Golovnin
> 
> 




More information about the core-libs-dev mailing list