JDK 8 code review request for 8005042 Add Method.isDefault to core reflection

Peter Levart peter.levart at gmail.com
Wed Dec 19 09:19:54 UTC 2012


On 12/19/2012 10:01 AM, Peter Levart wrote:
> On 12/19/2012 01:35 AM, David Holmes wrote:
>> On 19/12/2012 10:24 AM, Joe Darcy wrote:
>>> On 12/18/2012 04:20 PM, David Holmes wrote:
>>>> On 19/12/2012 10:16 AM, Joe Darcy wrote:
>>>>> On 12/18/2012 04:12 PM, David Holmes wrote:
>>>>>> On 19/12/2012 8:40 AM, Louis Wasserman wrote:
>>>>>>> It's not 100% obvious to me whether this refers to a default
>>>>>>> implementation
>>>>>>> in an interface, a class which inherits that default implementation
>>>>>>> and does not override it, or both. Is that worth clarifying in 
>>>>>>> the doc,
>>>>>>> rather than forcing readers to check the JLS citation?
>>>>>>
>>>>>> The issue is where you obtained this Method reference from:
>>>>>>
>>>>>> - from the Interface? then it is a default method
>>>>>> - from a class implementing the interface but not redefining the
>>>>>> method? then it is a default method
>>>>>
>>>>> Actually, that is *now* how HotSpot represents this case in core
>>>>> reflection at the moment. HotSpot uses a new method object to 
>>>>> represent
>>>>> the default method woven into an implementing class.
>>>>
>>>> *now* -> *not* ??
>>>
>>> Correct.
>>>
>>>>
>>>> It may be a new Method object but getDeclaringClass() should give the
>>>> interface class NOT the concrete class. That is currently the case for
>>>> abstract interface methods. I hope it is the same for default methods!
>>>
>>> It is not at the moment, which is a bit surprising.
>>
>> Very surprising! I'd call that a major bug.
>
> Not only default methods, also abstract interface methods show-up in 
> the implementing class's declared methods. For example the following 
> test:
>
> public class DefaultMethodsTest {
>     public interface I {
>         void i();
>         default void d() { }
>     }
>
>     public abstract static class S {
>         public abstract void a();
>         public void s() { }
>     }
>
>     public abstract static class C extends S implements I {
>         public void c() { }
>     }
>
>     public static void main(String[] args) {
>         for (Method m : C.class.getDeclaredMethods())
>             System.out.println(m.getName());
>     }
> }
>
>
> prints:
>
> c
> i
> d
>
...but only if there *is* a default method in interface. The following test:

public class DefaultMethodsTest {
     public interface I {
         void i();
//        default void d() { }
     }

     public abstract static class S {
         public abstract void a();
         public void s() { }
     }

     public abstract static class C extends S implements I {
         public void c() { }
     }

     public static void main(String[] args) {
         for (Method m : C.class.getDeclaredMethods())
             System.out.println(m.getName());
     }
}

prints only:

c

>
> Regards, Peter
>
>>
>> David
>> -----
>>
>>
>>> -Joe
>




More information about the core-libs-dev mailing list