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