JDK 8 code review request for 8005042 Add Method.isDefault to core reflection
Peter Levart
peter.levart at gmail.com
Wed Dec 19 09:34:36 UTC 2012
Hi Joe,
I think that besides this bug, also the Class.privateGetPublicMethods()
will need to be revised. Currently it suppresses any methods from direct
interfaces that either:
- have a non-abstract method with same signature in a superclass
- have an abstract or non-abstract method with same signature in this class
Now because of the class-always-wins rule, an abstract method from a
superclass that is declared in a class (not interface) also has to
suppress any default method coming from any direct interface, don't you
think?
Regards, Peter
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
>
>
> Regards, Peter
>
>>
>> David
>> -----
>>
>>
>>> -Joe
>
More information about the core-libs-dev
mailing list