JDK-5062759 : (reflect) Class.getDeclaredMethods returns array containing inherited methods
  • Type: Bug
  • Component: core-libs
  • Sub-Component: java.lang:reflect
  • Affected Version: 5.0
  • Priority: P4
  • Status: Resolved
  • Resolution: Not an Issue
  • OS: windows_xp
  • CPU: x86
  • Submitted: 2004-06-14
  • Updated: 2013-09-17
  • Resolved: 2013-09-17
Related Reports
Relates :  
Description

Name: gm110360			Date: 06/14/2004


FULL PRODUCT VERSION :
java version "1.5.0-beta"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0-beta-b32c)
Java HotSpot(TM) Client VM (build 1.5.0-beta-b32c, mixed mode)

ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows XP [Version 5.1.2600]

A DESCRIPTION OF THE PROBLEM :
In API Specification 1.5
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Class.html#getDeclaredMethods()

> Returns an array of Method objects reflecting all the methods declared by the class or interface represented by this Class object.
> This includes public, protected, default (package) access, and private methods, but excludes inherited methods.

However,  current  implementation was against  specification. not excludes inherited methods.

STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
exec following source code.

EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
inconsecutive

public synchronized int java.lang.StringBuffer.length()
public synchronized int java.lang.StringBuffer.capacity()
public synchronized void java.lang.StringBuffer.ensureCapacity(int)
public synchronized void java.lang.StringBuffer.trimToSize()
public synchronized void java.lang.StringBuffer.setLength(int)
public synchronized char java.lang.StringBuffer.charAt(int)
public synchronized int java.lang.StringBuffer.codePointAt(int)
public synchronized int java.lang.StringBuffer.codePointBefore(int)
public synchronized void java.lang.StringBuffer.getChars(int,int,char[],int)
public synchronized void java.lang.StringBuffer.setCharAt(int,char)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.append(java.lang.String)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.append(java.lang.Object)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.append(java.lang.StringBuffer)
public java.lang.StringBuffer java.lang.StringBuffer.append(java.lang.CharSequence)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.append(java.lang.CharSequence,int,int)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.append(char[])
public synchronized java.lang.StringBuffer java.lang.StringBuffer.append(char[],int,int)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.append(boolean)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.append(char)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.append(int)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.appendCodePoint(int)
static int java.lang.StringBuffer.stringSizeOfInt(int)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.append(long)
static int java.lang.StringBuffer.stringSizeOfLong(long)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.append(float)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.append(double)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.delete(int,int)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.deleteCharAt(int)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.replace(int,int,java.lang.String)
public synchronized java.lang.String java.lang.StringBuffer.substring(int)
public synchronized java.lang.CharSequence java.lang.StringBuffer.subSequence(int,int)
public synchronized java.lang.String java.lang.StringBuffer.substring(int,int)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.insert(int,char[],int,int)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.insert(int,java.lang.Object)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.insert(int,java.lang.String)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.insert(int,char[])
public java.lang.StringBuffer java.lang.StringBuffer.insert(int,java.lang.CharSequence)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.insert(int,java.lang.CharSequence,int,int)
public java.lang.StringBuffer java.lang.StringBuffer.insert(int,boolean)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.insert(int,char)
public java.lang.StringBuffer java.lang.StringBuffer.insert(int,int)
public java.lang.StringBuffer java.lang.StringBuffer.insert(int,long)
public java.lang.StringBuffer java.lang.StringBuffer.insert(int,float)
public java.lang.StringBuffer java.lang.StringBuffer.insert(int,double)
public int java.lang.StringBuffer.indexOf(java.lang.String)
public synchronized int java.lang.StringBuffer.indexOf(java.lang.String,int)
public int java.lang.StringBuffer.lastIndexOf(java.lang.String)
public synchronized int java.lang.StringBuffer.lastIndexOf(java.lang.String,int)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.reverse()
public synchronized java.lang.String java.lang.StringBuffer.toString()
private synchronized void java.lang.StringBuffer.writeObject(java.io.ObjectOutputStream) throws java.io.IOException
private void java.lang.StringBuffer.readObject(java.io.ObjectInputStream) throws java.io.IOException,java.lang.ClassNotFoundException
ACTUAL -
public volatile java.lang.AbstractStringBuilder java.lang.StringBuffer.append(java.lang.CharSequence,int,int)
public volatile java.lang.AbstractStringBuilder java.lang.StringBuffer.append(char[])
public volatile java.lang.AbstractStringBuilder java.lang.StringBuffer.append(char[],int,int)
public volatile java.lang.Appendable java.lang.StringBuffer.append(java.lang.CharSequence) throws java.io.IOException
public volatile java.lang.AbstractStringBuilder java.lang.StringBuffer.append(java.lang.StringBuffer)
public volatile java.lang.AbstractStringBuilder java.lang.StringBuffer.append(java.lang.CharSequence)
public volatile java.lang.AbstractStringBuilder java.lang.StringBuffer.append(double)
public volatile java.lang.AbstractStringBuilder java.lang.StringBuffer.append(float)
public volatile java.lang.Appendable java.lang.StringBuffer.append(char) throws java.io.IOException
public synchronized java.lang.StringBuffer java.lang.StringBuffer.append(java.lang.Object)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.append(java.lang.String)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.append(java.lang.StringBuffer)
public java.lang.StringBuffer java.lang.StringBuffer.append(java.lang.CharSequence)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.append(java.lang.CharSequence,int,int)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.append(char[])
public synchronized java.lang.StringBuffer java.lang.StringBuffer.append(char[],int,int)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.append(boolean)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.append(char)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.append(int)
public volatile java.lang.AbstractStringBuilder java.lang.StringBuffer.append(boolean)
public volatile java.lang.AbstractStringBuilder java.lang.StringBuffer.append(java.lang.Object)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.append(long)
public volatile java.lang.AbstractStringBuilder java.lang.StringBuffer.append(java.lang.String)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.append(float)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.append(double)
public volatile java.lang.AbstractStringBuilder java.lang.StringBuffer.append(char)
public volatile java.lang.AbstractStringBuilder java.lang.StringBuffer.append(int)
public volatile java.lang.AbstractStringBuilder java.lang.StringBuffer.append(long)
public synchronized java.lang.String java.lang.StringBuffer.toString()
public synchronized char java.lang.StringBuffer.charAt(int)
public synchronized int java.lang.StringBuffer.codePointAt(int)
public synchronized int java.lang.StringBuffer.codePointBefore(int)
public synchronized void java.lang.StringBuffer.getChars(int,int,char[],int)
public synchronized int java.lang.StringBuffer.indexOf(java.lang.String,int)
public int java.lang.StringBuffer.indexOf(java.lang.String)
public synchronized int java.lang.StringBuffer.lastIndexOf(java.lang.String,int)
public int java.lang.StringBuffer.lastIndexOf(java.lang.String)
public synchronized int java.lang.StringBuffer.length()
public synchronized java.lang.StringBuffer java.lang.StringBuffer.replace(int,int,java.lang.String)
public volatile java.lang.AbstractStringBuilder java.lang.StringBuffer.replace(int,int,java.lang.String)
public synchronized java.lang.CharSequence java.lang.StringBuffer.subSequence(int,int)
public synchronized java.lang.String java.lang.StringBuffer.substring(int)
public synchronized java.lang.String java.lang.StringBuffer.substring(int,int)
private synchronized void java.lang.StringBuffer.writeObject(java.io.ObjectOutputStream) throws java.io.IOException
private void java.lang.StringBuffer.readObject(java.io.ObjectInputStream) throws java.io.IOException,java.lang.ClassNotFoundException
public synchronized int java.lang.StringBuffer.capacity()
public synchronized void java.lang.StringBuffer.ensureCapacity(int)
public synchronized void java.lang.StringBuffer.trimToSize()
public synchronized java.lang.StringBuffer java.lang.StringBuffer.appendCodePoint(int)
public volatile java.lang.AbstractStringBuilder java.lang.StringBuffer.appendCodePoint(int)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.delete(int,int)
public volatile java.lang.AbstractStringBuilder java.lang.StringBuffer.delete(int,int)
public volatile java.lang.AbstractStringBuilder java.lang.StringBuffer.deleteCharAt(int)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.deleteCharAt(int)
public volatile java.lang.AbstractStringBuilder java.lang.StringBuffer.insert(int,long)
public volatile java.lang.AbstractStringBuilder java.lang.StringBuffer.insert(int,int)
public volatile java.lang.AbstractStringBuilder java.lang.StringBuffer.insert(int,char)
public volatile java.lang.AbstractStringBuilder java.lang.StringBuffer.insert(int,boolean)
public volatile java.lang.AbstractStringBuilder java.lang.StringBuffer.insert(int,java.lang.CharSequence,int,int)
public volatile java.lang.AbstractStringBuilder java.lang.StringBuffer.insert(int,float)
public java.lang.StringBuffer java.lang.StringBuffer.insert(int,java.lang.CharSequence)
public volatile java.lang.AbstractStringBuilder java.lang.StringBuffer.insert(int,java.lang.String)
public volatile java.lang.AbstractStringBuilder java.lang.StringBuffer.insert(int,java.lang.Object)
public volatile java.lang.AbstractStringBuilder java.lang.StringBuffer.insert(int,char[],int,int)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.insert(int,char[])
public volatile java.lang.AbstractStringBuilder java.lang.StringBuffer.insert(int,java.lang.CharSequence)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.insert(int,java.lang.CharSequence,int,int)
public java.lang.StringBuffer java.lang.StringBuffer.insert(int,boolean)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.insert(int,java.lang.String)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.insert(int,java.lang.Object)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.insert(int,char[],int,int)
public volatile java.lang.AbstractStringBuilder java.lang.StringBuffer.insert(int,double)
public java.lang.StringBuffer java.lang.StringBuffer.insert(int,float)
public java.lang.StringBuffer java.lang.StringBuffer.insert(int,long)
public volatile java.lang.AbstractStringBuilder java.lang.StringBuffer.insert(int,char[])
public java.lang.StringBuffer java.lang.StringBuffer.insert(int,double)
public synchronized java.lang.StringBuffer java.lang.StringBuffer.insert(int,char)
public java.lang.StringBuffer java.lang.StringBuffer.insert(int,int)
public volatile java.lang.AbstractStringBuilder java.lang.StringBuffer.reverse()
public synchronized java.lang.StringBuffer java.lang.StringBuffer.reverse()
public synchronized void java.lang.StringBuffer.setCharAt(int,char)
public synchronized void java.lang.StringBuffer.setLength(int)
static int java.lang.StringBuffer.stringSizeOfInt(int)
static int java.lang.StringBuffer.stringSizeOfLong(long)


REPRODUCIBILITY :
This bug can be reproduced always.

---------- BEGIN SOURCE ----------
Method[] methods = StringBuffer.class.getDeclaredMethods();
for( int i = 0 ; i < methods.length ; i++ ){
	System.out.println(methods[i]);
}
---------- END SOURCE ----------
(Incident Review ID: 270846) 
======================================================================

Comments
I have looked through the initial report. Looks like bridge methods. Closing this.
17-09-2013

If this is indeed just a case of bridge method blue, the issue can be closed as not a bug.
14-08-2013

EVALUATION These are compiler-generated synthetic bridge methods. ###@###.### 2004-06-14 Verified one method from the example in the comments section is synthetic; this bug is related to 5064052. ###@###.### 2004-06-18
14-06-2004