Class.getDeclaredMethods() is returning inherited methods
David Holmes
david.holmes at oracle.com
Tue Jan 8 04:31:09 UTC 2019
I've filed:
https://bugs.openjdk.java.net/browse/JDK-8216324
for the JVM TI bug.
David
-----
On 8/01/2019 11:38 am, David Holmes wrote:
> On 7/01/2019 11:35 pm, Michael Rasmussen wrote:
>>> On 7/01/2019 8:46 pm, Michael Rasmussen wrote:
>>>> Hi,
>>>>
>>>> We recently discovered something similar, although with the native
>>>> counterparts of getDeclaredMethods: the JVM-TI function
>>>> GetClassMethods and the JDI method ReferenceType.methods().
>>>> The documentation for which states "Only directly declared methods
>>>> are returned (not inherited methods)" or "(...) declared directly in
>>>> this type. Inherited methods are not included."
>>>>
>>>> When running the code pasted below with HotSpot (tried OpenJDK8 and
>>>> 11), I get the following output:
>>>> [public abstract java.lang.String app1.Test$Child.method2()]
>>>> [public default java.lang.String app1.Test$Child.method(), public
>>>> abstract java.lang.String app1.Test$Child.method2()]
>>>
>>> This would appear to be a bug with JVM TI in how default methods are
>>> accounted for. GetClassMethods simply looks at the methods defined in
>>> the instanceKlass, but for interfaces default methods are included. I'll
>>> look into this in more detail and file a hotspot bug.
>>
>> An interesting thing is that it's not the default method "def" that is
>> listed, but the abstract method "method" (with incorrect modifier?)
>
> Sorry yes I misread the original code and just looked at the extra
> "default method" in the output. Definitely something not right there.
>
> Thanks,
> David
>>
>> /Michael
>>
More information about the core-libs-dev
mailing list